一、导航条navigation bar
1、导航条navigationbar属于导航控制器,一个导航控制器只有一个导航条。
2、在一个导航控制器push新页面和pop页面时,导航条是同一个。
3、在一个视图控制器内改变了导航条的样式,其它控制器的导航条的样式也会改变,也说明了导航条属于导航控制器,而不是每个视图控制器都有一个导航条。
4、导航条的层级结构
navigationbar层级
navigationBarBackground层级
UIBarBackground视图是比UINavigationBar视图要大
二、导航栏与self.view布局问题
iOS开发过程当中遇到导航栏遮挡布局的问题,在页面跳转后,下级页面也会被导航栏所遮挡。
如果你的容器是UINavigationController,在iOS7之前导航栏默认为半透明的,布局默认会从顶部开始,所以会被遮挡。
解决方案1:
在iOS7 UIViewController引入了一个新的属性edgesForExtendedLayout,默认为UIRectEdgeAll,即铺满整个屏幕
self.edgesForExtendedLayout =UIRectEdgeNone;设置后布局从导航栏下开始
解决方案2:
self.navigationController.navigationBar.translucent =NO;
将导航栏设置为不透明后,布局会自动放到导航栏以下。
三、导航栏与self.view高度问题
在带有导航栏的控制器中,viewDidLoad方法执行前后self.view的高度是不一致的,执行前为屏幕的高度,而执行后则减去导航栏+状态栏的高度。
//以iphone6为例
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"执行前%d",CGRectGetHeight(self.view.frame));
}
- (void)viewDidAppear:(BOOL) animated{
[super viewDidLoad];
NSLog(@"执行后%d",CGRectGetHeight(self.view.frame));
}
log:
执行前667
执行前603
准确说应该是viewWillAppear和viewDidAppear之间self.view高度发生变化
在viewWillAppear时视图控件布局还没有设置,因此对于一个VC,self.view就是最原始的状态,从屏幕顶端开始,高度为ScreenHeight
在viewDidAppear时视图已经显示在屏幕上了,self.view以及子视图的布局已经设置好了,而self.view由于导航栏不透明或其他原因,其布局是从导航栏下方开始到屏幕底部,高度为ScreenHeight-64,64为导航栏(44)+状态栏(20)高度
四、navigationBar与navigationItem
1、navigationbar继承自UIView,通常是位于屏幕顶端的控件。
2、navigationbar是navigationitem的容器,以stack的形式管理UINavigationitem。需要说明的是UInavigationbar属于导航控制器,且只有一个,navigationitem是独立存在的不属于导航控制器也不属于导航条,它是视图控制器的属性,每一个viewController都有一个navigationitem。navigationbar提供了多种方法来管理单个和多个navitionItem。
3、UINavigationitem也是容器。包括titleView 、左侧N个按钮,右侧N个按钮这些控件,并提供了方法来管理这些控件。