iOS7.0后UIViewController新增的布局相关属性,主要是为了方便全屏布局。
edgesForExtendedLayout:self.view能延伸到屏幕的方向
extendedLayoutIncludesOpaqueBars:延伸的布局是否包括bar,只在不透明的时候有作用
automaticallyAdjustsScrollViewInsets:是否给滑动视图添加insets
这里主要讨论一下这些属性和navigationBar.translucent一起使用的一个优先级。
1.优先级
先展示几张测试结果
1.self.edgesForExtendedLayout = UIRectEdgeNone下,navigationBar.translucent = YES/NO,extendedLayoutIncludesOpaqueBars = YES/NO,都会是以navigationBar左下为子视图起点,self.view.bounds.size会减去64高度。
2.self.edgesForExtendedLayout = UIRectEdgeAll(默认值),navigationBar.translucent = YES,extendedLayoutIncludesOpaqueBars = YES/NO;都会以左上为起点,self.view.bounds为全屏。
3.self.edgesForExtendedLayout = UIRectEdgeAll(默认值),navigationBar.translucent = NO,extendedLayoutIncludesOpaqueBars = YES时,会以左上为起点,self.view.bounds为全屏。
4.self.edgesForExtendedLayout = UIRectEdgeAll(默认值),navigationBar.translucent = NO,extendedLayoutIncludesOpaqueBars =NO时,会以navigationBar左下为子视图起点,self.view.bounds.size会减去64高度。
综上:优先级是先看edgesForExtendedLayout,再看navigationBar是否透明,在不透明的情况下才看extendedLayoutIncludesOpaqueBars。以上这几个属性是对被添加的子视图布局产生影响,达到的效果基本相同,但还是有细微的区别。而automaticallyAdjustsScrollViewInsets只是针对滑动视图(是做为第一个子视图)。而且只是对滑动视图里面的内容做调整,设置了ScrollView的Insets。滑动视图自己仍然受上面属性的影响。
结论:从这些属性的默认值来下看,都是尽量在维持self.view的全屏性,可能是因为在loadview里面默认是获取到的全屏布局的view,这个时候拿到frame.size是全屏的,一旦使用这个frame布局时,不一定是准确的,当有不透明的bars时,这个frame就没有减去bar的高度,只有在viewDidLayoutSubviews里面拿到的frame才是最终的。
以上纯粹个人理解,如果有不对或者更深理解的欢迎吐槽。