navigationcontroller剖析

概述:

系统原生的navigationcontroller非常强大, 几乎所有的程序都基于系统的导航控制器做开发

它的navigationbar的有2种形态

navigationbar的frame其实是CGRectMake(0, 20, 设备宽度, 44)

self.navigationBar.layer.masksToBounds = YES; 

,-setMasksToBounds:方法告诉layer将位于它之下的layer都遮盖住。这是必须的,这样会使圆角不被遮,但是这样会导致阴影效果没有,很多网上都给出资料,再添加一个SubLayer,添加阴影。(意思也就是讲mask作为bound的边界,对原来的frame进行裁剪??)

navigationbar的frame就会变成是CGRectMake(0, 20, 设备宽度, 44)

1.translucent = YES

2.1.translucent = NO

一. translucent = YES的情况

scrollview会自动设置insets,

并且导航是半透明的,

self.view的起点是(0, 0)

设置一张透明图片, 并且设置UIBarMetricsCompact参数, 就可以让导航看起来是透明的

 [self.navigationBar setBackgroundImage:[UIImage imageNamed:@"bigShadow.png"] forBarMetrics:UIBarMetricsCompact];

一. translucent = NO的情况

scrollview不会做任何适配

并且导航是不透明的,

self.view的起点是(64, 0)

二.导航控制器的层次剖析

2.1. NavigationBar

包含子视图

_UINavigationBarBackground

_UINavigationBarBackIndicatorView

2.2.UINavigationTransitionView

包含子视图

UIViewControllerWrapperView

 

三.导航对控制器的处理

3.1.如果导航控制器的translucent=NO, 并且viewcontroller里一个子控制器

如果设置在viewdidload方法或之前的方法里

设置了 childviewcontroller.view.frame = cgrectmake(0, 0, self.view.width-64, self.view.height);

那么你的childviewcontroller.view的高度就会比预计少64px,( 因为导航控制器的translucent=no的情况下, 会把当前所有的控制器的view的height全部减去64)

原文地址:https://www.cnblogs.com/apem/p/4969571.html