前言:
@1控制器管理:viewControllers(直接管理)
@2导航条管理:UINavigationBar 管理items(对bar设置会影响到其他vc 所以在这个上面添加view之后 记得remove!!!!)
补充
-
导航控制器永远显示的是栈顶控制器的view
-
导航控制器中做界面之间的跳转必须取到导航控制器
-
调用pop方法并不会马上销毁当前控制器
-
popToViewController使用注意点:传入进去的控制器必须是导航控制器栈里面的控制器 ( ARC 是自动管理内存,autopool释放池什么时候清理就什么时候释放没有被引用的对象, 一般runloop一个循环完成会执行这个操作)
-
导航条的内容由栈顶控制器决定,一个导航控制器只有一个导航条,因此只能由一个控制器决定,谁先显示在最外面,谁就是栈顶控制器.
-
在iOS7之后,默认会把导航条上的按钮的图片渲染成蓝色.
-
导航条上的子控件位置不需要我们管理,只需要管理尺寸
-
UINavigationItem:是一个模型,决定导航条的内容(左边内容,中间,右边内容)
-
UIBarButtonItem:是一个模型,决定导航条上按钮的内容
-
以后只要看到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 是配置下一个控制器的返回按钮
网友评论