APP中多种样式导航栏的处理办法
2016-11-25 本文已影响268人
soulDxl
Snip20161125_2.png项目中有需求,每个页面的导航栏颜色不一样,刚开始不觉得有什么问题,但是操作后发现是个坑啊,用手势返回的时候,两个控制器的导航栏就会出现奇怪的问题。导航栏作为根控制器,正常的话只有一个,更改一个页面导航栏的颜色,另外一个就变化了。上网查看后,大概有几种解决办法。
- 方法一:使用iOS 7之后开放的,UIViewControllerAnimatedTransitioning协议,来实现自定义导航栏转场动画及交互。
- 方法二:包装,让每个控制器控制器拥有自己独立的导航栏。
- 方法三:在每次Push前对当前页面进行截图并保存到数组,Pop时取数组最后一个元素显示,滑动结束后调用系统Pop方法并删除最后一张截图。
方法一和三是参考一篇博客的(想了解的童鞋可以点击这里了解一下),还没有具体的实践过,有时间还要试试。我下面重点说一下方法二,我使用的方法。
正常导航栏是不可以将导航栏添加子控制器的。我们需要进行一下包装处理,把我们将要push的控制器包裹一层导航栏。如下
//包装过程
-(PackViewController *)packViewController:(UIViewController *)viewController
{
PackNavController *packNav = [[PackNavController alloc] init];
packNav.viewControllers = @[viewController];
[self addChildViewController:packNav];
self.packNav = packNav;
return self;
}
// 注意, 这里压入的是一个包装过后的控制器
PackViewController *packViewController = [[PackViewController new] packViewController:viewController];
[self.navigationController pushViewController:packViewController animated:animated];
使用的时候
XLNavgationController *nav = [[XLNavgationController alloc]
initWithRootViewController:[[ViewController alloc] init]];
[self.window setRootViewController:nav];
NextViewController *push = [[NextViewController alloc] init];
[self.navigationController pushViewController:push animated:YES];
大致这样的过程,里面具体的实现可以参考Demo,代码里有比较详细的处理。
不足的地方,欢迎指出。😀