美文网首页I love iOSiOS实用技能iOS知识点
APP中多种样式导航栏的处理办法

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

作者: soulDxl | 来源:发表于2016-11-25 16:22 被阅读268次

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

    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,代码里有比较详细的处理。

    不足的地方,欢迎指出。😀

    相关文章

      网友评论

      • Code_Ninja:建议在PackNavController中也实现popToViewController:animated:和popToRootViewControllerAnimated:方法。同时在pushViewController:animated:中需加上
        packViewController.hidesBottomBarWhenPushed = viewController.hidesBottomBarWhenPushed;
        soulDxl:@Code_Ninja 嗯嗯,确实得这样,谢谢提醒。 :+1:

      本文标题:APP中多种样式导航栏的处理办法

      本文链接:https://www.haomeiwen.com/subject/sqqwpttx.html