一、简介
iOS中以栈的形式保存子控制器,如下图
nav栈.png
导航控制显示的永远是我们栈顶控制器的view
二、 简单使用
简单的创建方式
UIViewController*vc = [[UIViewControlleralloc] init];UINavigationController*nav = [[UINavigationControlleralloc] initWithRootViewController:vc];self.window.rootViewController = nav;
三、底层实现
这里讲一下 navigation 底层的实现逻辑,其实就是解释这行代码的逻辑:
UINavigationController *nav =[[UINavigationController alloc]initWithRootViewController:vc];
底层系统默认的调用了push方法将我们的vc设置成为栈底跟视图。
四、层次结构
我们来看看 navigationcontroller 的层次结构
当我们将一个控制器装入一个 navigationcontroller 并设为跟控制器之后,就会看到层次中多了一个 UILayoutContainerView 中包含了连个视图,一个是UINavigationTransitionView、一个是UINavigationBar视图。UINavigationTransitionView 装载的就是当前栈顶控制器所承载的视图,UINavigationBar 就是我们的导航栏视图。
nav1.png
nav2.png
nav3.png
五、注意事项
前方高能:automaticallyAdjustsScrollViewInsets这个属性默认将controller上所有的scrollView都向下偏移64,由于笔者被其所坑,找了三天bug才找出它来,所以一定要慎用此属性。
在iOS7之后,系统默认会给导航控制器中所有的UIScrollVIew的顶部添加额外的滚动区域64,消除方法:
self.automaticallyAdjustsScrollViewInsets =NO;
设置导航条透明方法:其实是设置导航条内的背景图片的颜色是透明的
[self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault];
设置导航条阴影背景,也是设置图片:
[self.navigationController.navigationBar setShadowImage:[[UIImage alloc] init]];