{"id":20468831,"url":"https://github.com/xifenglang/jknavigationcontroller","last_synced_at":"2025-04-13T10:27:07.724Z","repository":{"id":209430106,"uuid":"49866952","full_name":"XiFengLang/JKNavigationController","owner":"XiFengLang","description":"最高支持iOS10，已停止更新","archived":false,"fork":false,"pushed_at":"2017-06-27T11:46:15.000Z","size":4090,"stargazers_count":61,"open_issues_count":8,"forks_count":11,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-27T01:51:26.055Z","etag":null,"topics":["navigationbar","navigationcontroller","pop","push"],"latest_commit_sha":null,"homepage":"","language":"Objective-C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/XiFengLang.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2016-01-18T09:41:48.000Z","updated_at":"2023-04-14T13:27:23.000Z","dependencies_parsed_at":"2023-11-27T10:34:52.138Z","dependency_job_id":"1ae12d7f-5fb7-41a3-9d04-830a4eae9c3c","html_url":"https://github.com/XiFengLang/JKNavigationController","commit_stats":null,"previous_names":["xifenglang/jknavigationcontroller"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/XiFengLang%2FJKNavigationController","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/XiFengLang%2FJKNavigationController/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/XiFengLang%2FJKNavigationController/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/XiFengLang%2FJKNavigationController/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/XiFengLang","download_url":"https://codeload.github.com/XiFengLang/JKNavigationController/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248697385,"owners_count":21147320,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["navigationbar","navigationcontroller","pop","push"],"created_at":"2024-11-15T14:06:58.432Z","updated_at":"2025-04-13T10:27:07.696Z","avatar_url":"https://github.com/XiFengLang.png","language":"Objective-C","readme":"\n**iOS11正在适配中，2017.6.14**\n\n![version](https://img.shields.io/badge/Version-2.1.2-blue.svg) ![platform](https://img.shields.io/badge/platform-iOS-ligtgrey.svg)  ![ios](https://img.shields.io/badge/Requirements-iOS8%2B-green.svg)\n\nJKNavigationController\n===\n\n`JKNavigationController `通过KVC调用私有API，已通过上架审核，目前已有2个上线项目使用`JKNavigationController`(2017.4.22)。\n\n\n## 目录\n\n* [JKNavigationController简介](#JKNavigationController)\n* [JKNavigationController迭代记录](#Updation)\n* [JKNavigationController用法](#Usage)\n  * [1.引入头文件](#import)\n  * [2.将UINavigationController换成JKRootNavigationController](#replace)\n  * [3.为每个控制器VC的导航栏navigationBar定制颜色、透明度](#navigationBar)\n  * [4.全屏侧滑返回手势](#PopGestrue)\n  * [5.修改navigationBar.tintColor](#tintColor)\n  * [6.navigationBar渐变位移效果](#Offset)\n  * [7.拦截自定义返回按钮的点击事件](#shouldPopItem)\n* [其他注意点](#Prompt)\n\n\n\n## \u003ca id=\"JKNavigationController\"\u003e\u003c/a\u003eJKNavigationController简介 ##\n\n开始我只是想实现NavigationBar的渐变透明效果，但后来发现界面切换时会出现问题，对Push/Pop兼容性很差，折腾了一段时间也就放弃了，直到看到这篇文章[《用Reveal分析网易云音乐的导航控制器切换效果》](http://jerrytian.com/2016/01/07/用Reveal分析网易云音乐的导航控制器切换效果/)。然后就照着作者`JNTian`的思路，整合(搬运)了三个框架的代码，即[Leo的LTNavigationBar](https://github.com/ltebean/LTNavigationBar)、[SunnyDog的FDFullscreenPopGesture](https://github.com/forkingdog/FDFullscreenPopGesture)和[JNTian的JTNavigationController](https://github.com/JNTian/JTNavigationController#jtnavigationcontroller)，最后实现了为每个控制器定制一个专属导航栏的效果，即每个customViewController都有一一对应的navigationController和navigationBar，可以为每个控制器定制导航栏的颜色。其次，自定义了侧滑返回手势，兼容Push/Pop动画。文章[《用Reveal分析网易云音乐的导航控制器切换效果》](http://jerrytian.com/2016/01/07/用Reveal分析网易云音乐的导航控制器切换效果/)中介绍的就是[JNTian的JTNavigationController](https://github.com/JNTian/JTNavigationController#jtnavigationcontroller)的实现思路，可以先看博客文章再研究源码，`JNTian `介绍的很详细，很容易理解。\n\n\n![image](http://wx3.sinaimg.cn/mw690/c56eaed1gy1fet9vxwqtyg20ak0j5twm.gif)\n\n## \u003ca id=\"Updation\"\u003e\u003c/a\u003eJKNavigationController迭代记录\n* 2.1.2：解决tabBarController.viewControllers全部提前走viewDidLoad的BUG(1.0.1)，修改后界面显示才会走viewDidLoad\n* 2.1.1：解决设置self.navigationItem.backBarButtonItem无效的BUG\n* 2.1：增加返回按钮点击事件的拦截机制\n* 2.0：兼容了iOS8、iOS9、iOS10，增加了对Push和Pop动画的兼容，并增加全屏侧滑返回手势\n* 1.0：实现NavigationBar渐变效果，在iOS10上有兼容性BUG，并且没有适配Push/Pop切换动画。\n\n\n## \u003ca id=\"Usage\"\u003e\u003c/a\u003e JKNavigationController用法\n\n### \u003ca id=\"import\"\u003e\u003c/a\u003e 1.引入头文件\n\n```Object-c\n\t#import \"JKNavigationController.h\"\n```\n\n`JKNavigationController.h`包括了4个类文件：\n\u003e \"UINavigationBar+JKTransparentize.h\" 修改navigationBar的背景色，可以实现渐变、位移效果\n\u003e \"JKRootNavigationController\" 多样式导航控制器切换效果\n\u003e \"UIViewController+JKNavigationController.h\" 全屏侧滑手势开关\n\u003e \"JKBackIndicatorButton.h\" 自定义返回按钮\n\n### \u003ca id=\"replace\"\u003e\u003c/a\u003e 2.将入口处的UINavigationController换成JKRootNavigationController\n\n```Object-C\n\tJKRootNavigationController * nav = [[JKRootNavigationController alloc] initWithRootViewController:homeVC];\n```\n\n### \u003ca id=\"navigationBar\"\u003e\u003c/a\u003e 3.为每个控制器VC的导航栏navigationBar定制颜色、透明度\n\n**全局设置多个控制器vc.navigationController.navigationBar的背景颜色**，navigationBar.jk_barBackgroundColor属性具有全局效果，通过这个属性设置导航栏颜色，会影响后续Push的destinationVC导航栏的背景色。如果大部分界面的导航栏颜色一样，只要在第一个控制器设置navigationBar.jk_barBackgroundColor属性值就行。\n\n```Object-C\n\tfirstVC.navigationController.navigationBar.jk_barBackgroundColor = [UIColor orangeColor];\n```\n因为在`JKInterLayerNavigationController`类中重写了push方法，并且进行了下面的操作，起到了传递效果。\n\n```Object-C\n\tdestinationVC.navigationController.navigationBar.jk_barBackgroundColor = fromViewController.navigationController.navigationBar.jk_barBackgroundColor\n```\n\n**设置当前控制器vc.navigationController.navigationBar的背景颜色**，只会作用当前界面的navigationBar，此方法只能实现当前控制器导航栏navigationBar的渐变效果，不会影响其他控制器导航栏的颜色，也不会阻断navigationBar.jk_barBackgroundColor的传递效果，这一点需要注意。比如有Avc-\u003eBvc-\u003eCvc这种顺序结构的多个控制器，Avc设置了navigationBar.jk_barBackgroundColor，Bvc通过下面的方法定制颜色，但实际上Avc.navigationBar.jk_barBackgroundColor == Bvc.navigationBar.jk_barBackgroundColor == Cvc.navigationBar.jk_barBackgroundColor。\n\n```Object-C\n\t[self.navigationController.navigationBar jk_setNavigationBarBackgroundColor:[UIColor orangeColor]];\n```\n![image](http://wx4.sinaimg.cn/mw690/c56eaed1gy1fet9vx65x0g20bh0263zu.gif)\n\n\n### \u003ca id=\"PopGestrue\"\u003e\u003c/a\u003e 4.全屏侧滑返回手势\n\n**全局控制 全屏侧滑返回手势的开关**，会影响后续Push的destinationVC的`jk_fullScreenPopGestrueEnabled`，原因跟navigationBar.jk_barBackgroundColor一样，都是一层一层地传递赋值。\n\n```Object-C\n\tself.jk_rootNavigationController.jk_fullScreenPopGestrueEnabled = YES;\n```\n\n**控制单个控制器的全屏侧滑返回手势的开关**,需要注意的是关闭全屏侧滑手势后，会使用系统原生的侧滑返回功能。\n\n```Object-C\n\tself.jk_fullScreenPopGestrueEnabled = NO;\n```\n\n### \u003ca id=\"tintColor\"\u003e\u003c/a\u003e 5.修改navigationBar.tintColor\n\n因为有自定义返回按钮`JKBackIndicatorButton`，建议使用下面的方法修改tintColor，`JKBackIndicatorButton `内部会重绘背景图片，如果只设置navigationBar.tintColor，将不会修改`JKBackIndicatorButton `的颜色。\n\n```Object-C\n\t[self.navigationController.navigationBar jk_setTintColor:[UIColor purpleColor]];\n\n/// 不推荐\n// self.navigationController.navigationBar.tintColor = [UIColor whiteColor];\n```\n\n### \u003ca id=\"Offset\"\u003e\u003c/a\u003e 6.navigationBar渐变位移效果\n\n如果要实现知乎日报首页的效果，即NavigationBar的渐变偏移效果，则调用下面的代码。\n\n```Object-C\n\t[navigationBar jk_setNavigationBarVerticalOffsetY:(CGFloat)offsetY]\n\n/// 方法内部调用jk_setNavigationBarSubViewsAlpha:(CGFloat)alpha实现渐变色效果\n```\n![image](http://wx3.sinaimg.cn/mw690/c56eaed1gy1fet9vxkztug20bh026jsz.gif)\n\n\n### \u003ca id=\"shouldPopItem\"\u003e\u003c/a\u003e 7.拦截自定义返回按钮的点击事件\n\n如果需要拦截返回按钮的点击事件，在控制器中实现`JKNavigationControllerDelegate `协议方法即可。\n\n```Object-C\n- (BOOL)jk_navigationController:(JKRootNavigationController *)navigationController\n                  shouldPopItem:(UINavigationItem *)item {\n    do something...\n    return yes or no\n}\n                  \n```\n\n## \u003ca id=\"Prompt\"\u003e\u003c/a\u003e其他注意点\n\n需要注意一点，如果使用了StoryBoard或者XIB，并且在Push时隐藏TabBar，可能会出现留白或者闪烁。原因跟AutoLayout的更新时机有关，解决的思路是从TableView的Bottom约束入手，纯代码创建的控制器应该没问题。\n\n\u003cimg src=\"http://wx4.sinaimg.cn/mw690/c56eaed1gy1fet9vymyw9j212e0uijyo.jpg\" width=\"800\" height=\"600\"\u003e\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxifenglang%2Fjknavigationcontroller","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxifenglang%2Fjknavigationcontroller","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxifenglang%2Fjknavigationcontroller/lists"}