美文网首页
UINavgationBar导航栏背景的相关问题

UINavgationBar导航栏背景的相关问题

作者: Da雪山 | 来源:发表于2017-10-19 12:08 被阅读13次

    问题的背景:

    当使用系统的导航控制器 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 手势返回过渡完美
    -(解决了导航栏透明--不透明之间切换错位问题)
    让我们一次性解决导航栏的所有问题

    相关文章

      网友评论

          本文标题:UINavgationBar导航栏背景的相关问题

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