Skip to content

GKNavigationBarViewController的分类实现,耦合度底,使用更便捷

License

Notifications You must be signed in to change notification settings

QuintGao/GKNavigationBar

Repository files navigation

GKNavigationBar

iOS自定义导航栏 - 导航栏联动效果

Build Status License MIT platform languages cocoapods Carthage compatible support

GKNavigationBarViewController的分类实现方式,耦合度底,使用更加便捷

Swift版本请看这里 → GKNavigationBarSwift

框架特性

  • 无侵入性,低耦合性
  • 支持自定义导航栏样式(隐藏、透明等)
  • 支持控制器开关返回手势
  • 支持控制器开关全屏返回手势
  • 支持控制器设置导航栏透明度,可实现渐变效果
  • 完美解决UITableView,UIScrollView滑动手势冲突
  • 可实现push,pop时控制器缩放效果(如:今日头条)
  • 可实现左滑push一个控制器的效果(如:网易新闻)

1.7.0版本升级指南

1.7.0版本重写了导航栏item间距调整的逻辑,1.7.0版本之后导航栏item间距调整只对使用GKCustomNavigationBar的控制器默认开启,其他控制器不会调整导航栏item间距,所以需要注意下面几点:
1、对于使用GKCustomNavigationBar的控制器,无需修改,如果想关闭导航栏间距调整设置gk_disableFixNavItemSpace即可
2、对于使用系统导航栏的控制器,如果想要调整导航栏间距,需要在viewDidLoad中设置gk_openFixNavItemSpace为YES 全局配置是无效的。
3、去掉了shiledItemSpaceVCs属性,可在单独控制器中处理。

使用

1、在AppDelegate中添加导航配置

[GKConfigure setupDefaultConfigure]

2、创建根导航控制器

若要开启手势处理,需使用+ (instancetype)rootVC:(UIViewController *)rootVC方法创建导航控制器

UINavigationController *nav = [UINavigationController rootVC:[GKMainViewController new]];

3、设置导航栏属性(调用即创建)

self.gk_navBackgroundColor = [UIColor red]

安装

CocoaPods
# 将以下内容添加到您的Podfile中:
pod 'GKNavigationBar'

// 只使用手势处理
pod 'GKNavigationBar/GestureHandle'
Carthage
Cartfile文件中添加以下内容
github "QuintGao/GKNavigationBar"

执行carthage update --platform iOS
SPM
在Xcode中点击File->Swift Packages->Add Package Dependency,然后输入https://github.com/QuintGao/GKNavigationBar
手动导入
直接拖入GKNavigationBar文件夹到项目,#import "GKNavigationBar.h",开始使用

常见问题

感谢使用该库,如果在使用过程中遇到问题可查看issue或提交issue,或者进QQ群1047100313

1、手势不生效?
1、查看是否使用了+ (instancetype)rootVC:(UIViewController *)rootVC 方法初始化导航控制器  
2、查看是否在控制器中禁用了手势返回self.gk_interactivePopDisabled = YES,self.gk_fullScreenPopDisabled = YES
2、导航栏不显示?
查看是否调用了跟导航栏相关的方法,如self.gk_navTitle = @"GKNavigationBar"  
注意:只有调用跟导航栏相关的方法才会初始化导航栏!
3、切换控制器的时候出现状态栏显示异常(一半黑一半白等)
解决办法:在控制器初始化方法里面设置状态栏样式
- (instancetype)init {
    if (self = [super init]) {
        self.gk_statusBarStyle = UIStatusBarStyleLightContent;
    }
    return self;
}

4、状态栏相关方法无效?
解决办法:在基类控制器里实现下面两个方法
- (BOOL)prefersStatusBarHidden {
    return self.gk_statusBarHidden;
}

- (UIStatusBarStyle)preferredStatusBarStyle {
    return self.gk_statusBarStyle;
}
5、返回手势如何拦截?
// 重写下面的方法,拦截返回手势
#pragma mark - GKGesturePopHandlerProtocol
- (BOOL)navigationShouldPop {
    // do something
    
    return NO;
}

也可以单独处理点击返回和手势返回

// 重写下面的方法,拦截点击返回
- (BOOL)navigationShouldPopOnClick {
    // do something
    
    return NO;
}
// 重写下面的方法,拦截手势返回
- (BOOL)navigationShouldPopOnGesture {
    // do something
    
    return NO;
}
6、如何与系统导航平滑过渡?
1、开启系统导航过渡处理 nav.gk_openSystemNavHandle = YES;
2、在控制器中设置gk_popDelegate并实现下面的方法
#pragma mark - GKViewControllerPopDelegate
- (void)viewControllerPopScrollBegan {
    
}

- (void)viewControllerPopScrollUpdate:(float)progress {
    // 由于已经出栈,所以self.navigationController为nil,不能直接获取导航控制器
    UIViewController *vc = [GKConfigure visibleViewController];
    vc.navigationController.navigationBar.alpha = 1 - progress;
}

- (void)viewControllerPopScrollEnded:(BOOL)finished {
    // 由于已经出栈,所以self.navigationController为nil,不能直接获取导航控制器
    UIViewController *vc = [GKConfigure visibleViewController];
    vc.navigationController.navigationBar.alpha = 1;
    vc.navigationController.navigationBarHidden = finished;
}

版本记录

最近更新
* 1.9.0 - 2024.03.21 1、tabBar截屏清除优化 2、增加隐私清单
* 1.8.9 - 2024.01.16 修复开启缩放后的异常问题 #111
* 1.8.8 - 2023.10.13 适配iOS17,修复非全屏模式的bug
* 1.8.7 - 2023.08.15 导航栏部分属性支持StoryBoard,手势处理优化
* 1.8.6 - 2023.07.17 修复导航栏间距调整可能无效的问题
* 1.8.5 - 2023.06.28 导航栏宽度适配Mac
* 1.8.4 - 2023.03.29 修复导航栏间距调整bug
* 1.8.3 - 2023.03.24 1、push、pop转场动画修改为只截取tabBar播放 2、缩放转场动画优化
* 1.8.2 - 2022.12.27 iPhone 14适配优化
* 1.8.1 - 2022.09.29 移除导航栏上的点击事件
* 1.8.0 - 2022.09.16 导航栏高度适配iPhone 14系列新设备
* 1.7.9 - 2022.08.18 修复侧滑返回可能出现导航栏间距不准确问题
* 1.7.8 - 2022.08.16 屏蔽导航栏的touches事件和点击事件
* 1.7.7 - 2022.07.29 修复当子控制器有GKNavigationBar时,导航栏item间距失效的问题 #103
* 1.7.6 - 2022.07.22 修复只设置backImage后,返回按钮显示错误的问题
* 1.7.5 - 2022.06.22 优化backImage的显示
* 1.7.4 - 2022.04.20 修复设置背景色为[UIColor clearColor]无效的bug #100,#101
* 1.7.3 - 2022.04.15 导航栏设置适配iOS13及以后
* 1.7.2 - 2022.03.21 细节优化,修复push UITabBarController时的问题
* 1.7.1 - 2022.03.09 根控制器左侧item处理优化,暗黑模式适配优化
* 1.7.0 - 2022.02.25 导航栏item间距优化处理
历史更新
* 1.6.6 - 2022.01.26 新机型适配优化
* 1.6.5 - 2022.01.20 修复设置gk_disableFixNavItemSpace后gk_disableFixSpace无效的bug#93
* 1.6.4 - 2022.01.04 新增darkBackgroundImage、darkLineImage等适配暗黑模式导航图片
* 1.6.2 - 2021.12.29 修复设置gk_disableFixSpace为YES无效的bug #16
* 1.6.1 - 2021.11.08 1、修复设置gk_systemGestureHandleDisabled后TabBar偏移问题 #90
                   2、新增gk_hidesBottomBarWhenPushed,可全局配置push时是否隐藏TabBar
* 1.6.0 - 2021.09.09 修复visibleViewController方法返回错误问题
* 1.5.9 - 2021.06.25 配置类增加backgroundImage,可设置全局导航图片
* 1.5.8 - 2021.06.09 增加恢复系统导航栏显示的逻辑及方法 #86
* 1.5.7 - 2021.05.20 修复bug #78,创建导航栏item方法优化
* 1.5.6 - 2021.05.18 优化导航栏返回按钮及高度处理#77,手势处理优化
* 1.5.5 - 2021.05.14 修复导航栏间距失效的问题#76
* 1.5.4 - 2021.05.12 修复可能提前触发viewDidLoad方法的问题
* 1.5.3 - 2021.05.07 修复直接设置背景色无效的问题#71,#74,增加对非全屏的支持
* 1.5.2 - 2021.04.06 增加协议方法,解决返回手势与WKWebView中的手势冲突问题
* 1.5.1 - 2021.03.09 返回手势优化,新增backStyle对应的image,可全局配置
* 1.5.0 - 2021.03.05  
----1、优化状态栏样式修改及显隐方法,可以不用在基类实现相关方法  
----2、导航栏添加机制优化,修复某些情况下可能出现两个导航栏的bug  
----3、增加全局开启UIScrollView手势处理方法
* 1.4.3 - 2021.02.23 导航栏高度适配优化,导航栏间距调整优化,控制器增加禁止导航栏间距调整属性#62 #67
* 1.4.2 - 2021.02.20 返回拦截优化,增加同时处理点击返回和手势返回的方法
* 1.4.1 - 2021.02.07 暗黑模式适配优化,导航栏背景色和分割线颜色支持设置动态颜色
* 1.4.0 - 2020.12.25 修复边缘滑动返回失效的bug #60
* 1.3.9 - 2020.12.24 手势处理优化,解决可能出现的卡死问题,push、pop手势灵敏度优化
* 1.3.7 - 2020.12.05 手势处理优化,增加禁用系统手势处理属性
* 1.3.6 - 2020.12.02 修复iPhone 12,iPhone 12 Pro机型导航栏间距调整不准确的bug
* 1.3.4 - 2020.12.01 修复可能出现的卡死情况#53
* 1.3.3 - 2020.11.29 手势滑动优化,支持与系统导航平滑衔接、控制器屏蔽支持部分匹配
* 1.3.0 - 2020.10.29 功能模块拆分,可按需pod不同模块
* 1.2.0 - 2020.10.26 优化代码宏定义,增加自定义转场demo
* 1.1.8 - 2020.10.22 适配iPhone 12 系列手机,增加自定义转场动画属性
* 1.1.6 - 2020.09.09 修复左滑push卡住不动的bug
* 1.1.5 - 2020.08.14 修复屏蔽控制器无效的bug
* 1.1.3 - 2020.07.28 修复导航栏标题或颜色不生效的bug
* 1.1.2 - 2020.07.27 修复方法交换可能带来的crash问题
* 1.1.1 - 2020.07.23 修复手势处理对根控制器的影响
* 1.1.0 - 2020.07.22 修复手势处理存在的问题,增加属性可屏蔽某些控制器对手势处理的影响
* 1.0.9 - 2020.07.16 增加gk_backImage,可自定义返回按钮图片
* 1.0.8 - 2020.07.06 增加某些控制器对导航栏间距调整的影响
* 1.0.7 - 2020.06.22 设置导航栏间距不再局限于GKNavigationBar
* 1.0.6 - 2020.06.18 修复设置导航栏间距失效的bug
* 1.0.0 - 2020.01.14 修复设置某个导航栏间距后其他导航栏间距不准确问题
* 0.0.5 - 2020.01.02 修复某些情况下状态栏显示异常问题
* 0.0.4 - 2019.12.22 优化状态栏切换功能
* 0.0.3 - 2019.11.12 修复设置导航栏左右间距无效的问题
* 0.0.2 - 2019.11.04 优化代码,解决只调用gk_navigationItem时导航栏不出现的bug
* 0.0.1 - 2019.11.03 对GKNavigationBarViewController做了修改,使用更方便

作者

            

回到顶部