GKNavigationBarViewController需要继承,侵入性较高,推荐使用GKNavigationBar
另外Swift版本GKNavigationBarSwift
现在大多数的APP都有导航栏联动效果,即滑动返回的时候导航栏也跟着一起返回,比如:网易新闻,网易云音乐,腾讯视频等等,于是通过查找一些资料及其他库的做法,自己也写了一个框架,可以让每一个控制器都拥有自己的导航栏,可以很方便的改变导航栏的样式等
iOS自定义导航栏-导航栏联动(一),GKNavigationController
iOS自定义导航栏-导航栏联动(二),GKNavigationBarViewController
感谢使用该库,如果在使用过程中遇到问题可查看issue或提交issue,或者进QQ群1047100313
1、有时修改状态栏会闪动(从黑色变成白色等)或状态栏颜色显示异常(左边黑色右边白色等)
在UIViewController的init方法中修改gk_statusBarStyle即可
需要修改IQKeyBoardManager源码,将系统导航手势修改为自定义手势,如下
UIPanGestureRecognizer *gesture = [strongRootController.navigationController valueForKey:@"panGesture"];
if (gesture.state == UIGestureRecognizerStateBegan) {
strongSelf.rootViewControllerWhilePopGestureRecognizerActive = strongRootController;
strongSelf.topViewBeginOriginWhilePopGestureRecognizerActive = strongSelf.topViewBeginOrigin;
}
* 支持自定义导航栏样式(隐藏、透明等)
* 支持控制器开关返回手势
* 支持控制器开关全屏返回手势
* 支持控制器设置导航栏透明度,可实现渐变效果
* 完美解决UITableView,UIScrollView滑动手势冲突
* 可实现push,pop时控制器缩放效果(如:今日头条)
* 可实现左滑push一个控制器的效果(如:网易新闻)
配置默认值 在AppDelegate的didFinishLaunchingWithOptions方法中配置导航栏的默认属性:
[GKConfigure setupCustomConfigure:^(GKNavigationBarConfigure *configure) {
// 导航栏背景色
configure.backgroundColor = [UIColor whiteColor];
// 导航栏标题颜色
configure.titleColor = [UIColor blackColor];
// 导航栏标题字体
configure.titleFont = [UIFont systemFontOfSize:18.0f];
// 导航栏返回按钮样式
configure.backStyle = GKNavigationBarBackStyleBlack;
// 导航栏itme左右间距
configure.gk_navItemLeftSpace = 12.0f;
configure.gk_navItemRightSpace = 12.0f;
}];
将基类控制器修改为GKNavigationBarViewController 可在每个控制器的viewDidLoad中单独设置导航栏的样式
- (void)viewDidLoad {
[super viewDidLoad];
// 设置导航栏样式
self.gk_navTitle = @"Demo";
self.gk_navTitleColor = [UIColor whiteColor];
self.gk_navBackgroundColor = [UIColor redColor];
self.gk_navShadowColor = [UIColor blackColor];
self.gk_backStyle = GKNavigationBarBackStyleWhite;
self.gk_navRightBarButtonItem = self.moreItem;
}
今日头条的实现
UINavigationController作为根控制器,包含一个UITabBarController,UITabBarController中包含以GKNavigationBarViewController为父类的子类
导航栏创建方式
GKToutiaoViewController *toutiaoVC = [GKToutiaoViewController new];
// 根控制器是导航控制器,需要缩放
UINavigationController *nav = [UINavigationController rootVC:toutiaoVC translationScale:YES];
UITabBarController作为根控制器,包含带导航栏的以GKNavigationBarViewController为父类的子类
UITabBarController作为根控制器,包含带导航栏的以GKNavigationBarViewController为父类的子类 其中导航栏开启左滑push手势,主要代码如下:
// 导航栏开启左滑push
UINavigationController *nav = [UINavigationController rootVC:vc translationScale:NO];
nav.gk_openScrollLeftPush = YES;
// 单个控制器中设置左滑push代理,并实现方法
1. // 设置push的代理
self.gk_pushDelegate = self;
2. 实现代理方法
- (void)pushToNextViewController {
GKWYNewsCommentViewController *detailVC = [GKWYNewsCommentViewController new];
detailVC.hidesBottomBarWhenPushed = YES;
[self.navigationController pushViewController:detailVC animated:YES];
}
UINavigationController
/** 导航栏转场时是否缩放,此属性只能在初始化导航栏的时候有效,在其他地方设置会导致错乱 */
@property (nonatomic, assign, readonly) BOOL gk_translationScale;
/** 是否开启左滑push操作,默认是NO */
@property (nonatomic, assign) BOOL gk_openScrollLeftPush;
UIViewController
/** 是否禁止当前控制器的滑动返回(包括全屏返回和边缘返回) */
@property (nonatomic, assign) BOOL gk_interactivePopDisabled;
/** 是否禁止当前控制器的全屏滑动返回 */
@property (nonatomic, assign) BOOL gk_fullScreenPopDisabled;
/** 全屏滑动时,滑动区域距离屏幕左边的最大位置,默认是0:表示全屏都可滑动 */
@property (nonatomic, assign) CGFloat gk_popMaxAllowedDistanceToLeftEdge;
/** 设置导航栏的透明度 */
@property (nonatomic, assign) CGFloat gk_navBarAlpha;
/** push代理 */
@property (nonatomic, assign) id<GKViewControllerPushDelegate> gk_pushDelegate;
GKNavigationBarViewController
/**
自定义导航条
*/
@property (nonatomic, strong, readonly) UINavigationBar *gk_navigationBar;
/**
自定义导航栏栏目
*/
@property (nonatomic, strong, readonly) UINavigationItem *gk_navigationItem;
#pragma mark - 额外的快速设置导航栏的属性
@property (nonatomic, strong) UIColor *gk_navBarTintColor;
@property (nonatomic, strong) UIColor *gk_navBackgroundColor;
@property (nonatomic, strong) UIImage *gk_navBackgroundImage;
@property (nonatomic, strong) UIColor *gk_navTintColor;
@property (nonatomic, strong) UIView *gk_navTitleView;
@property (nonatomic, strong) UIColor *gk_navTitleColor;
@property (nonatomic, strong) UIFont *gk_navTitleFont;
@property (nonatomic, strong) UIBarButtonItem *gk_navLeftBarButtonItem;
@property (nonatomic, strong) NSArray<UIBarButtonItem *> *gk_navLeftBarButtonItems;
@property (nonatomic, strong) UIBarButtonItem *gk_navRightBarButtonItem;
@property (nonatomic, strong) NSArray<UIBarButtonItem *> *gk_navRightBarButtonItems;
pod 'GKNavigationBarViewController'