美文网首页
导航控制器(Nav) 详细解说

导航控制器(Nav) 详细解说

作者: 池鹏程 | 来源:发表于2017-04-12 10:07 被阅读0次

    前言:

    @1控制器管理:viewControllers(直接管理)
    @2导航条管理:UINavigationBar 管理items(对bar设置会影响到其他vc 所以在这个上面添加view之后 记得remove!!!!)

    补充

    1. 导航控制器永远显示的是栈顶控制器的view

    2. 导航控制器中做界面之间的跳转必须取到导航控制器

    3. 调用pop方法并不会马上销毁当前控制器

    4. popToViewController使用注意点:传入进去的控制器必须是导航控制器栈里面的控制器 ( ARC 是自动管理内存,autopool释放池什么时候清理就什么时候释放没有被引用的对象, 一般runloop一个循环完成会执行这个操作)

    5. 导航条的内容由栈顶控制器决定,一个导航控制器只有一个导航条,因此只能由一个控制器决定,谁先显示在最外面,谁就是栈顶控制器.

    6. 在iOS7之后,默认会把导航条上的按钮的图片渲染成蓝色.

    7. 导航条上的子控件位置不需要我们管理,只需要管理尺寸

    8. UINavigationItem:是一个模型,决定导航条的内容(左边内容,中间,右边内容)

    9. UIBarButtonItem:是一个模型,决定导航条上按钮的内容

    10. 以后只要看到item,通常都是苹果提供的模型,只要改模型就能修改苹果的某些控件.

    一、 属性介绍

    1、edgesForExtendedLayout
    这个属性我们字面上里面是四周延生,指定边缘要延伸的方向,IOS7鼓励全屏布局模式,默认值是UIRectEdgeAll。
    假如我们想从导航栏下面开始计算起始点,可以设置成UIRectEdgeNone或者UIRectEdgeLeft | UIRectEdgeBottom | UIRectEdgeRight
    2、extendedLayoutIncludesOpaqueBars
    这个属性看单词的意思,延伸视图包含不包含不透明的Bar,是用来指定导航栏是透明的还是不透明,IOS7中默认是YES,当滚动页面的时候我们隐约能在导航栏下面看到我们页面的试图:


    但是当我们设置一张不透明的图片作为导航栏背景时,该属性就会变成NO,这样不透明以后我们可以人为设置成YES达到延伸至导航栏的效果:

    (重要的话说三遍!!!!!!)凡是对navigationBar设置的都会影响到其他vc

     1. extendedLayoutIncludesOpaqueBars    ----扩展区域,属性是viewcontroller的,不会影响其他vc的
     2. self.navigationController.navigationBar.translucent = NO ----对本身的navigationbar控件进行操作,设置不透明,不还原,会影响到其他界面  
    

    3、automaticallyAdjustsScrollViewInsets
    由词意可是是否自动判断滚动视图的内边距,要说这个Insets呢我们就要首先说说scroll视图contentInset这个属性,
    4、modalPresentationCapturesStatusBarAppearance
    这个属性说的是,当前控制器present一个其他控制器上的非全屏界面我们是否接管status bar的外观,默认是NO,(我们从一个界面A present另一个全屏界面B时,status Bar 的外观控制被转交给被B )
    假如我们设置成YES,我们可以指定B界面的status bar,即使是非全屏的
    这个属性当present一个全屏界面时是被系统忽略的

    nav属性的详细解释看这里http://blog.csdn.net/zyzxrj/article/details/47832337

    二、自身结构

    1 导航区
        1.1 导航条(IOS7以前默认是不透明的灰黑色,IOS7后是透明的)
    2 内容区
        2.1 控制器View (IOS7以前,内容区默认是导航条下,从Y位置64开始。IOS7后即扁平化,内容区Y位置为0开始)
        2.2 内容区的大小控制在导航条下:
                2.2.1 导航条不透明,self.navigationController.navigationBar.translucent = NO;
                2.2.2 本身控制器的edgesForExtendedLayout为UIRectEdgeNone
               (edgesForExtendedLayout的意思如果即使视图中上有navigationBar,下有tabBar,那么视图仍会延伸覆盖到四周的区域。)
    3 toolbar区 基本上用不到
    
    导航条两种情况  1不透明 和 2透明(默认)
        1不透明情况
                1.1内容区,从导航条下开始即64开始(可以简单的认为是一种安全模式,系统对控件没做多余的处理,在IOS7之前,默认是不透明的)
                1.2不透明但想从0开始extendedLayoutIncludesOpaqueBars = YES;
                                 edgesForExtendedLayout = UIRectEdgeAll
                    但这种情况基本用不到。
    
        2透明情况
                2.1内容区从导航条位置开始,即0开始
                2.2automaticallyAdjustsScrollViewInsets属性针对Scrollview的处理,默认YES,bounds下移64, NO时正常.
                2.3edgesForExtendedLayout针对本身View的处理,可以配置内容区的开始位置, UIRectEdgeNone从64开始,不扩展, UIRectEdgeAll整个容器范围(另外可以结合extendedLayoutIncludesOpaqueBars使用)
    
        总结:只要内容区位置从0开始,就要注意系统是否偏移了Scrollview, 即2.2提到的属性
    

    三、Nav的本质(多控制管理)

    一个控制器管理, 一个导航条管理
    @1控制器管理:viewControllers(直接管理)
    @2导航条管理:UINavigationBar 管理items
                    items 里面是UINavigationItem(UINavigationItem + title/titleView)
                        UINavigationItem管理UIBarButtonItem(返回按钮,left,right等按钮)
    
    
    
    1、管理控制器,   UINavigationTransitionView上管理
    2、管理导航条状态,UINavigationBar上管理
    从层级上看,UINavigationTransitionView和UINavigationBar是同一级别的,
              动画两个场所:UINavigationTransitionView(控制器上的动画转场)
                         UINavigationBar(导航条的动画转场)
    
    
    navigationBar.hiddern = YES和 navigationBarHidden的区别
    一个是控制器的方法,操作控制器的,一个是UI自身方法,操作的是自身
    一个是removeFromSuperView  一个是对自身进行hidden操作
    
    注意:
        self.navigationItem.backBarButtonItem 是配置下一个控制器的返回按钮

    相关文章

      网友评论

          本文标题:导航控制器(Nav) 详细解说

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