问题的背景:
当使用系统的导航控制器 UINavgationController进行 push 操作时,无法使每个 VC 有自己单独的导航栏,因为它们(这些被 push 的控制器)是共用的一个导航栏, 如果在某一个界面更改了 navBar的属性,则在其他界面的导航栏也全部被改变了.
简介:
- 改变导航栏的背景颜色 的方法
- pop右滑手势返回 的方法
- 不同 vc的导航栏切换过渡问题(重点)
一.改变导航栏的背景颜色
首先介绍一下通过系统的方法设置 navBar 背景颜色
设置属性 barTintColor
self.navigationController.navigationBar.barTintColor = [UIColor greenColor];
设置背景图片(图片是通过颜色生成的)
[self.navigationController.navigationBar setBackgroundImage:[[UIImage imageWithColor:[UIColor redColor]] forBarMetrics:UIBarMetricsDefault];
二. pop右滑手势返回
iOS7之后,使用系统导航控制器可以默认通过向右滑动的手势,实现返回上一个界面,自动实现了 pop 方法,很方便;但是实际使用中会遇到一些手势冲突的问题
1.设置 leftBarButtonItem 导致右滑失效
一般我们在自定义的导航控制器 BaseNavController中,通过重写 push 方法统一设置leftBarButtonItem,来实现统一返回按钮,此时会导致右滑手势失效,
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated{
if (self.childViewControllers.count > 0) {
viewController.hidesBottomBarWhenPushed = YES;
viewController.navigationItem.leftBarButtonItem = [UIBarButtonItem backItemWithimage:[UIImage imageNamed:@"navigationButtonReturn"] highImage:[UIImage imageNamed:@"navigationButtonReturnClick"] target:self action:@selector(back) title:@"返回"];
}
[super pushViewController:viewController animated:animated];
}
- (void)back{
[self popViewControllerAnimated:YES];
}
解决办法:
重新实现手势代理<UIGestureRecognizerDelegate>方法, returen Yes
self.interactivePopGestureRecognizer.delegate = self;
// 决定是否触发手势
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
return self.childViewControllers.count > 1;
}
2. 全屏右滑返回
还是通过系统的方法实现, 首先将系统自带的手势 enable = NO, 然后新建一个 pan 手势添加到导航控制器的 self.view 上
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self.interactivePopGestureRecognizer.delegate action:@selector(handleNavigationTransition:)];
[self.view addGestureRecognizer:pan];
pan.delegate = self;
self.interactivePopGestureRecognizer.enabled = NO;
//消除方法警告
-(void)handleNavigationTransition:(UIPanGestureRecognizer *)pan{
}
三. 不同 vc的导航栏切换过渡问题(重点)
1.隐藏-->显示 之间的切换
可以先将系统的导航栏隐藏,然后创建一个 UIView作为一个假的导航栏, 可以在viewWillAppear中设置隐藏:
注意 animated:YES
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:YES animated:YES];
}
方法控制不同vc导航栏隐藏,在下一个不需要隐藏的 vc, 再次通过该方法将导航栏显示
参考: 每个界面拥有自己独立的导航栏
2.自定义
为每个控制器自定义UINavigationBar
可以为每个控制器 单独设置导航栏,并且相互之间不收影响, 并且 pop 手势返回过渡完美
-(解决了导航栏透明--不透明之间切换错位问题)
让我们一次性解决导航栏的所有问题
网友评论