APP中多种样式导航栏的处理办法

项目中有需求,每个页面的导航栏颜色不一样,刚开始不觉得有什么问题,但是操作后发现是个坑啊,用手势返回的时候,两个控制器的导航栏就会出现奇怪的问题。导航栏作为根控制器,正常的话只有一个,更改一个页面导航栏的颜色,另外一个就变化了。上网查看后,大概有几种解决办法。

APP中多种样式导航栏的处理办法_第1张图片
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,代码里有比较详细的处理。

不足的地方,欢迎指出。

你可能感兴趣的:(APP中多种样式导航栏的处理办法)