美文网首页IOS收藏ios开发笔记iOS开发精进
iOS 导航栏的自定义,完美侧滑返回

iOS 导航栏的自定义,完美侧滑返回

作者: Senior丶 | 来源:发表于2016-04-22 14:40 被阅读3003次
    知识的星空.jpg
    上篇中,我们提到的自定义的tabbar,随之而来的就是自定义导航控制器UINavigationController.
    • 一般在开发APP中,我们是把UITabBarControllerUINavigationController结合起来用的.上一篇中我们提到如何自定义tabbar用KVC来自定义Tabbar,这篇我们来简单谈谈如果自定义导航控制器.方法也很简单,我们直接上代码.
      1.如果想让UIViewController拥有pushpop的能力,那么就必须给这个控制器的根视图设置为导航控制器
    UIViewController *vc = [[UIViewController alloc]init];
    UINavigationController *navVC = [[UINavigationController alloc]initWithRootViewController:vc];
    

    这样的话,这个控制器就有了导航控制器的能力了.
    2.结合UITabBarController来设置.(这段代码是给tabbar设置子控制器的代码,如果不明白请看用KVC来自定义Tabbar)

    -(void)setupChildVc:(UIViewController *)vc title:(NSString *)title image:(NSString *)image selectedImage:(NSString *)selectedImage{
        //设置文字和图片
        vc.tabBarItem.title = title;
        vc.tabBarItem.image = [UIImage imageNamed:image];
        vc.tabBarItem.selectedImage = [UIImage imageNamed:selectedImage];
        vc.view.backgroundColor = [UIColor colorWithRed:arc4random_uniform(100)/100.0 green:arc4random_uniform(100)/100.0 blue:arc4random_uniform(100)/100.0 alpha:1.0];
        //设置为导航控制器,但是这里的是系统的
        UINavigationController *navVc = [[UINavigationController alloc]initWithRootViewController:vc];
        [self addChildViewController:navVc];
    }
    

    3.如果我们要用自己的,就要创建一个继承于UINavigationController的控制器,下面我们简称XTNavigationController,在XTNavigationController.m中我来拦截页面的push.

    -(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated{
        if (self.childViewControllers.count > 0) {
            //这里是设置了一个返回按钮,效果图如下
            UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
            [button setTitle:@"返回" forState:UIControlStateNormal];
            [button setImage:[UIImage imageNamed:@"navigationButtonReturn"] forState:UIControlStateNormal];
            [button setImage:[UIImage imageNamed:@"navigationButtonReturnClick"] forState:UIControlStateHighlighted];
            button.size = CGSizeMake(70, 30);
            //让按钮内部的所有内容左对齐
            button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
            //让按钮的内容往左偏移10
            button.contentEdgeInsets = UIEdgeInsetsMake(0, -10, 0, 0);
            [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
            [button setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
            [button addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
            // 修改导航栏左边的item
            viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button];
            // 隐藏tabbar
            viewController.hidesBottomBarWhenPushed = YES;
           }
            //这句super的push要放在后面, 让viewController可以覆盖上面设置的leftBarButtonItem
            [super pushViewController:viewController animated:animated];
    }
    -(void)back{
        [self popViewControllerAnimated:YES];
    }
    
    自定义的返回按钮.png

    4.这样的话侧滑返回的手势就没了,咱们还需要开启

    -(void)viewDidLoad {
        [super viewDidLoad];
         //设置导航条的图片
        [self.navigationBar setBackgroundImage:[UIImage imageNamed:@"navigationbarBackgroundWhite"] forBarMetrics:UIBarMetricsDefault];
        // 如果滑动移除控制器的功能失效,清空代理(让导航控制器重新设置这个功能)
        self.interactivePopGestureRecognizer.delegate = nil;
    }
    
    • 这样的话,无论我们在哪里点击push进去的页面,tabbar都是隐藏的,这样就对我们开发过程中是及其重要省力的,欢迎大家尝试!!!
    • 这个就是我们来自定义这个导航条,还是用的原生的来做.
    • 如有错误,欢迎雅正

    相关文章

      网友评论

      • Mr_Jee:存在一个问题,当第一个控制器侧滑时会出现卡死现象。
      • 花前月下:还没细看先mark一下
      • fd1d725aafc7:清空代理,记得重新赋值,不然根控制器会出问题
        Senior丶:@阿莫西林miku ???
      • STDawn:不错,这样就不用写viewcontrol的父类了
      • LoveY34:你的触发侧滑返回的代码好像会存在问题!
        Senior丶:@Lylhf 哪里?说出来大家讨论一下子.
        UItachi:@Lylhf 正解。

      本文标题:iOS 导航栏的自定义,完美侧滑返回

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