美文网首页
导航控制器 UINavigationController

导航控制器 UINavigationController

作者: LucXion | 来源:发表于2017-09-11 10:23 被阅读0次

    导航控制器 UINavigationController : 本质上就是一个控制器,可以直接作为主窗口(根Window)的控制器,其他的控制器通过添加到导航控制器上来实现功能
    //此时导航控制器的界面是整个主窗口,并且在最顶上有一个类似表头的框

    • 一、子控制器添加到导航控制器 add、push、.viewControllers的区别 :

    add: (一个一个添加,会覆盖) ,后面的控制器会不停的覆盖前面的控制器,最后只能添加一个控制器//

    push(一个一个添加,不会覆盖) ,并且可以设置动画效果
    效果: 会闪(因为动画效果),按顺序添加所有控制器,Window显示最后一个控制器,并且自动提供返回按钮
    如果modal跳转控制器不强引用,控制器就会消失,造成坏内存错误

    . viewControllers(一次性添加多个,不会覆盖)

    • 二、通过storyboard创建UINavigationController导航控制器

    首先设置根控制器 : 添加控制器(ViewController) - 1.右击navigation 2.选root 3.连线到新控制器

    按钮 实现连线下一个控制器 : 选择按钮右击-action-show(push也是能用,但是目前已经弃用了)
    //注意 : 此处show 和push的区别 ,push自动添加了navigationItem ,show需要手动添加

    //此时navigationItem有3个属性,标题,副标题,返回该控制器按钮的名称

    如果 ,将控制器连线到指定的控制器,会造成循环,没有pop,要实现pop必须要纯代码

    • 三、导航控制器对子控制器的管理

    规范 : 首先给导航控制器设置一个根控制器 ,这个控制器在导航控制器的创建阶段就可以设置 alloc init方法

    添加 :
    跳转到下一个控制器的原理 : 增加下一个控制器 / 在对应控制器的.m文件中实现
    实现步骤: 给当前对象的导航控制器添加控制器 , 如何获取导航控制器 - self.navigationController

    返回 :
    手动返回上一个控制器, 原理 :直接删除当前控制器 pop
    手动返回到根控制器, 原理 :直接删除中间所有的控制器 pop
    手动返回到指定控制器, 原理 :也是删除,pop,直接删除到

    self.navigationController.viewControllers[x]
    
    • 四、设置导航栏内容及常用属性

    当前控制器 : 就是栈顶控制器

    栈顶控制器的导航栏内容,由栈顶控制器的navigationItem决定
    navigationItem.title 标题 设置了标题等于间接的设置了返回这个控制器按钮的按钮名称
    navigationItem.leftBarButtonItem 左按钮 设置了左按钮跟返回按钮重叠,会覆盖返回按钮
    navigationItem.backBarButtonItem 返回按钮 创建返回按钮可以设置title ,如果不绑定方法,就会调用系统的返回方法,返回上一级

    1.hidesBarsOnSwipe属性: 滑动自动隐藏状态栏

    2.获取栈顶控制器的导航栏 :(在纯代码中也能用viewControllers属性获取子控制器)

    navVc.topViewController.navigationItem
    

    3.给navigationItem添加图片按钮

        UIImage *new = [img imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
        UIBarButtonItem *btn = [[UIBarButtonItem alloc]initWithImage:new style:0 target:self action:@selector(click:)];
        self.navigationItem.leftBarButtonItem = btn;
    设置返回按钮
        UIBarButtonItem *backbtn = [[UIBarButtonItem alloc]initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:nil action:nil];
        [self.navigationItem setBackBarButtonItem:backbtn];
    

    4.给控制器添加子控制器storyboard(通过storyboard创建控制器)

    两个步骤 :
     UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"copy1" bundle:nil];
     UINavigationController *navigation = [storyBoard instantiateInitialViewController];//初始化navigationController
     添加子控制器
      self.viewControllers = @[navigation1,navigation2,navigation3,navigation4,navigation5];
     //用addchildController会跟自定义tabBar冲突
     //子控制器间的跳转需要纯代码 :    
    

    5.设置导航栏背景颜色 :

    [self.navigationBar setBackgroundImage:[UIImage imageNamed:@"NavBar64"] forBarMetrics:UIBarMetricsDefault];
    设置导航栏标题,必须通过栈顶控制器的navigationItem 设置  MyHallController.navigationItem.title = @"标题";
    

    6.设置导航标题栏渲染色和标题字体色是不一样的:

    //设置 导航栏的标题的颜色
        NSDictionary *attrs = @{
                                NSForegroundColorAttributeName :[UIColor whiteColor]  
                                };
        [self.navigationBar setTitleTextAttributes:attrs];
    //设置渲染色
        [self.navigationBar setTintColor:[UIColor whiteColor]];
    

    7.设置导航条的透明度根据滚动渐变

    - (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    
     UIColor * color = [UIColor colorWithRed:0/255.0 green:175/255.0 blue:240/255.0 alpha:1];
        CGFloat offsetY = scrollView.contentOffset.y;
        if (offsetY > NAVBAR_CHANGE_POINT) {
            CGFloat alpha = MIN(1, 1 - ((NAVBAR_CHANGE_POINT + 64 - offsetY) / 64));
            [self.navigationController.navigationBar lt_setBackgroundColor:[color colorWithAlphaComponent:alpha]];
            
        } else {
            [self.navigationController.navigationBar lt_setBackgroundColor:[color colorWithAlphaComponent:0]];
        }
    }
    

    相关文章

      网友评论

          本文标题:导航控制器 UINavigationController

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