在开发App过程中, 一般整个App的导航栏大致风格都是一致, 这个时候一般有两种方式来处理:
- 使用系统自带的UINavigationContoller, 然后定义一个base的UIViewController作为基类, 设置好它的导航栏样式.后面的所有Controller都继承于它.
- 自定义导航栏控制器继承于UINavigationController, 在自定义导航栏里面设置.
对于第二种方式来设置, 会导致系统自带的侧滑返回手势失效.
1. 统一设置导航栏
//initialize方法在该类第一次使用时只会运行一次, 在这里统一配置
+(void)initialize {
UINavigationBar *bar = [UINavigationBar appearance];
//设置背景颜色
//bar.barTintColor = [UIColor colorWithRed:248 / 255.0 green:79 / 255.0 blue:83 / 255.0 alpha:1];
//背景图片
[bar setBackgroundImage:kImage(@”navigation_backgroundImage”) forBarMetrics:(UIBarMetricsDefault)];
//去掉全局导航条下面黑线
[bar setShadowImage:[UIImage new]];
//设置标题字体属性
bar.titleTextAttributes = @{NSForegroundColorAttributeName: [UIColor colorFromRGBValue:0xFFFFFF],
NSFontAttributeName : kPingFangLightFont(18)};
//设置导航栏是否透明, 如果为true, 那么controller里面的布局frame的x从状态栏开始, 否则从导航栏下面开始
if (__iOS_VERSION > 7.0) {
bar.translucent = false;
}
}
2. 解决导航栏侧滑返回失效
- 设置代理
//解决侧滑失效问题
-(void)viewDidLoad {
[super viewDidLoad];
//设置代理
self.interactivePopGestureRecognizer.delegate = self;
}
- 遵循协议
@interface HJNavigationController ()
- 实现代理协议
-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
return self.viewControllers.count > 1;
}
3. 对后续页面进行处理,例如当push一个UIViewController的时候, 希望leftBarButtonItem一样, 可以在这里处理.
-(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
if (self.viewControllers.count > 0) {
//隐藏tabBar
viewController.hidesBottomBarWhenPushed = YES;
//设置左边按钮
viewController.navigationItem.leftBarButtonItem = [UIBarButtonItem barButtonItemWithTitle:nil titleNormalColor:nil titleHighlightedColor:nil normalImage:@”back_normal” highlightedImage:@”back_press” target:self action:@selector(back:) edg:(UIEdgeInsetsMake(0, 0, 0, 0))];
}
[super pushViewController:viewController animated:animated];
}
//实现返回方法
-(void)back:(UIButton *)button {
[self popViewControllerAnimated:true];
}
4. 使指定页面的控制器不能侧滑返回
有时产品会希望一个流程完全走完, 而不要中间中断.除了需要对导航栏左侧按钮处理外还需要处理侧滑问题.在指定控制器里面实现下面方法即可.
-(void)viewDidAppear:(BOOL)animated{
if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
}
}
-(void)viewWillDisappear:(BOOL)animated{
self.navigationController.interactivePopGestureRecognizer.enabled = YES;
}