edgesForExtendedLayout | extende
一个ViewController的默认布局
我们在大部分的程序布局上是一个TableViewController在上下分别是:
TabBarController和NavigationController.
屏幕快照 2018-02-24 下午2.18.13.png
在我们添加任何代码的情况下运行后的布局如下:
Simulator Screen Shot - iPhone 8 Plus - 2018-02-24 at 14.29.41.png
在iOS7之后,苹果鼓励使用这种默认的全屏模式,默认的NavigationBar和TabBar是半透明,上下滑动Table的视图会上下延伸.也就是表示TableView的Frame和显示区域都是屏幕的大小.
edgesForExtendedLayout
UIViewController包含一个edgesForExtendedLayout属性,字面意思是拓展的边距布局
.
当我们设置:
self.edgesForExtendedLayout = UIRectEdgeNone;
Simulator Screen Shot - iPhone 8 Plus - 2018-02-24 at 14.31.13.png
上面代码达到的效果和设置TabBar和navigationBar的透明度达到的效果是一致的.即ViewController的主View的上下和大小发生了变换.变成了从NavigationBar的底部开始到TabBar的顶部结束.
self.navigationController.navigationBar.translucent = NO;
self.tabBarController.tabBar.translucent = NO;
这里要强调一下:edgesForExtendedLayout无论是TableViewController还是普通的ViewController影响是一致的.当设置edgesForExtendedLayout与否会直接影响主View的位置,如下:
默认不做任何设置
设置self.edgesForExtendedLayout = UIRectEdgeNone;
extendedLayoutIncludesOpaqueBars
这个属性字面意思:延伸的布局是否包括bar
,这个属性只有在Bar不透明的时候有作用.默认值是NO,即不延伸.
self.navigationController.navigationBar.translucent = NO;
self.extendedLayoutIncludesOpaqueBars = NO;//默认情况
Simulator Screen Shot - iPhone 8 Plus - 2018-02-24 at 16.07.34.png
self.navigationController.navigationBar.translucent = NO;
self.extendedLayoutIncludesOpaqueBars = YES;
这个时候self.view.bounds为全屏.
Simulator Screen Shot - iPhone 8 Plus - 2018-02-24 at 16.09.21.png
综上:优先级是先看edgesForExtendedLayout,再看navigationBar是否透明,在不透明的情况下才看extendedLayoutIncludesOpaqueBars。以上这几个属性是对被添加的子视图布局产生影响,达到的效果基本相同,但还是有细微的区别。
automaticallyAdjustsScrollViewInsets
这个属性的字面意思是:自动适配滚动视图的内容
,ios11之后已经弃用了.用的最新的Xcode已经无法在模拟器上重现了.
简单介绍一下,当我们设置:
self.edgesForExtendedLayout = UIRectEdgeAll;//默认值
self.automaticallyAdjustsScrollViewInsets = YES;//默认值
TableView的显示内容会从navigationBar的底部开始显示,向上滑动的时候还是会穿过透明的导航栏全屏扩展.
self.edgesForExtendedLayout = UIRectEdgeAll;//默认值
self.automaticallyAdjustsScrollViewInsets = NO;
这个时候TableView的显示内容会从全屏的左上角开始,也就是默认进入页面的时候, TableView的上面的Cell是被半透明的NavigationBar遮挡住的.
介绍了这么多都没什么用啦,因为ios11来啦.
automaticallyAdjustsScrollViewInsets在ios11上被弃用.
automaticallyAdjustsScrollViewInsets
edgesForExtendedLayout虽然没被弃用,但是在介绍里面有了替代的属性,safeArea相关的.
edgesForExtendedLayoutcontentInsetAdjustmentBehavior
ios11里面使用这个属性替代了automaticallyAdjustsScrollViewInsets.
这个属性的枚举值如下:
typedef NS_ENUM(NSInteger, UIScrollViewContentInsetAdjustmentBehavior) {
UIScrollViewContentInsetAdjustmentAutomatic, // Similar to .scrollableAxes, but for backward compatibility will also adjust the top & bottom contentInset when the scroll view is owned by a view controller with automaticallyAdjustsScrollViewInsets = YES inside a navigation controller, regardless of whether the scroll view is scrollable
UIScrollViewContentInsetAdjustmentScrollableAxes, // Edges for scrollable axes are adjusted (i.e., contentSize.width/height > frame.size.width/height or alwaysBounceHorizontal/Vertical = YES)
UIScrollViewContentInsetAdjustmentNever, // contentInset is not adjusted
UIScrollViewContentInsetAdjustmentAlways, // contentInset is always adjusted by the scroll view's safeAreaInsets
} API_AVAILABLE(ios(11.0),tvos(11.0));
- automatic 和scrollableAxes一样,scrollView会自动计算和适应顶部和底部的内边距并且在scrollView 不可滚动时,也会设置内边距.
- scrollableAxes 自动计算内边距.
- never 不计算内边距
- always 根据safeAreaInsets 计算内边距