美文网首页
导航栏问题

导航栏问题

作者: wq04200 | 来源:发表于2016-10-22 10:18 被阅读37次

    导航栏技术参考文章:http://tech.glowing.com/cn/change-uinavigationbar-backgroundcolor-dynamically/

    导航栏问题

    导航栏错乱http://www.jianshu.com/p/e4448c24d900

    1、设置导航栏背景色或者背景图片时,会因为导航栏默认的透明度问题 跟原效果色不同。 如果设置透明度translucent 为no。 有些第三方的布局会受到影响(一般下移64)。
    2、一级界面导航栏隐藏,二级界面显示。当pop回来的时候导航栏会消失。解决办法。在一级界面中,

    -(void)viewWillAppear:(BOOL)animated
    {
        [super viewWillAppear:animated];
    [self.navigationController setNavigationBarHidden:YES animated:animated];
    }
    
    -(void)viewWillDisappear:(BOOL)animated
    {
        self.navigationController.navigationBarHidden = NO;
        [super viewWillDisappear:animated];
    }
    

    3、去除导航栏下方线

    #define iOS10 ([[UIDevice currentDevice].systemVersion intValue]>=10?YES:NO)
    - (void)viewWillAppear:(BOOL)animated{ 
           [super viewWillAppear:animated];               
           [self.navigationController.navigationBar.subviews enumerateObjectsUsingBlock:^(UIView *view, NSUInteger idx, BOOL *stop) {
          if (iOS10) { 
          //iOS10,改变了导航栏的私有接口为_UIBarBackground 
          if ([view isKindOfClass:NSClassFromString(@"_UIBarBackground")]) { 
            [view.subviews firstObject].hidden = YES; 
            } 
        }else{ 
              //iOS10之前使用的是_UINavigationBarBackground 
                if ([view isKindOfClass:NSClassFromString(@"_UINavigationBarBackground")]) { [view.subviews firstObject].hidden = YES;
                                 }
                        }
              }];
    }
    

    精简版:

    - (void)viewWillAppear:(BOOL)animated{
              [super viewWillAppear:animated];           
             self.navigationController.navigationBar.subviews[0].subviews[0].hidden = YES;
         }
    

    4、导航栏返回按钮功能可以放在baseViewController中,iOS7之后系统提供了侧滑手势(interactivePopGestureRecognizer),即从屏幕左侧边缘滑起会pop回导航控制器栈的上个viewController。**不过如果你自定义了UINavigationViewController或者自定义了返回按钮,系统自带的侧滑返回功能会失效。可以如下操作,方一:

    self.navigationController.interactivePopGestureRecognizer.delegate = (id)self;
    

    方二:右滑返回功能可以去利用除系统屏幕边缘滑动返回,

    #import "ViewController.h"
    
    @interface ViewController ()<UIGestureRecognizerDelegate>
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        id target = self.navigationController.interactivePopGestureRecognizer.delegate;
    
        // handleNavigationTransition:为系统私有API,即系统自带侧滑手势的回调方法,我们在自己的手势上直接用它的回调方法
        UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)];
        panGesture.delegate = self; // 设置手势代理,拦截手势触发
        [self.view addGestureRecognizer:panGesture];
    
        // 一定要禁止系统自带的滑动手势
        self.navigationController.interactivePopGestureRecognizer.enabled = NO;
    }
    // 什么时候调用,每次触发手势之前都会询问下代理方法,是否触发
    // 作用:拦截手势触发
    - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
    {
        // 当当前控制器是根控制器时,不可以侧滑返回,所以不能使其触发手势
        if(self.navigationController.childViewControllers.count == 1)
        {
            return NO;
        }
        return YES;
    }
    @end
    

    但此方法涉及私有API不知是否影响上架,详见http://www.jianshu.com/p/737924684695

    标签栏TabBar

    TabBar嵌套Nav时,进行Push的时候隐藏TabBar的问题。(未完整待补充)
    隐藏方式:
    self.hidesBottomBarWhenPushed = YES;

    将viewWillAppear里面的代码更换成:
    if (self.navigationController.viewControllers.count > 1) {
    self.tabBarController.tabBar.hidden = YES;
    }else {
    self.tabBarController.tabBar.hidden = NO;
    }
    
    

    相关文章

      网友评论

          本文标题:导航栏问题

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