iOS-全屏展示的实现
分两种情况:
1.VC上添加的是UIView---contentView
直接设置:contentView.frame = [UIView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
2.VC上添加的是 scrollView/tableView
scrollView/tableView 就不能像上面一样设置了,原因:
参考链接:http://www.samirchen.com/ios-view-controller-full-screen-layout/
当我们采用全屏布局设置了 edgesForExtendedLayout 为 UIRectEdgeAll,而此时 View Controller 的 self.view 的第一个 Subview 是 UIScrollView 类型或其子类型(如:UITableView 等)时,automaticallyAdjustsScrollViewInsets 这个属性就会被用来辅助我们对 UIScrollView 类的视图进行布局。automaticallyAdjustsScrollViewInsets 默认值即为 YES。
拿 UITableView 来举例,你希望你的 UITableView 的内容从 NavigationBar 底部开始展示(因为不这样的话就会被 NavigationBar 遮住一部分),同时还需要在滑动时,UITableView 的布局又能填满全屏。这时你只需要设置 automaticallyAdjustsScrollViewInsets 为 YES 即可,系统会帮你调整 UITableView 的 contentInset 来实现效果使其中的内容不会被 NavigationBar、TabBar、TooBar 挡住。你可以同样在 - (void)viewWillLayoutSubviews 观察 UITableView 的 contentInset 的值。
当你设置它为 NO 时,UITableView 的 contentInset 则不会被被设置。
所以,如果 scrollView/tableView 时想全屏,需要进行设置:
在主VC 的 viewdidload中,设置
self.automaticallyAdjustsScrollViewInsets = NO;
但是,苹果文档提示:
@property(nonatomic,assign) BOOL automaticallyAdjustsScrollViewInsets API_DEPRECATED("Use UIScrollView's contentInsetAdjustmentBehavior instead", ios(7.0,11.0),tvos(7.0,11.0)); // Defaults to YES
所以,还要加上 contentInsetAdjustmentBehavior 的设置:
if(@available(iOS11.0, *)) {
_tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
关于contentInsetAdjustmentBehavior:参考链接:https://www.jianshu.com/p/b42030a37953
关于这个属性,系统提供了四种行为模式:
UIScrollViewContentInsetAdjustmentAutomatic --- 不作任何调整;
UIScrollViewContentInsetAdjustmentScrollableAxes
UIScrollViewContentInsetAdjustmentNever
UIScrollViewContentInsetAdjustmentAlways
首先是UIScrollViewContentInsetAdjustmentNever,如名所示:就算你的ScrollView超出了safeAreaInsets,系统不会对你的scrollView.adjustedContentInset做任何事情,即不作任何调整;
UIScrollViewContentInsetAdjustmentAlways: 只要超了安全区,就调整相应的超出值,调整的最大值不会超过安全区相应EdgeInsets方向的最大值,如刚刚上述第2点;
UIScrollViewContentInsetAdjustmentScrollableAxes:系统会根据ScrollView的滚动方向来进行判断,假设我只是一个横向滚动的ScrollView,那即便我的布局起点和高度值超过了self.view的安全区,那么系统也不会调整scrollView.adjustedContentInset对应的top与bottom方向值,只可垂直方向滚动同理,直接设置scrollView.scrollEnabled = NO也同理;
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行为相似,但是为了兼容以前①这种情况,即使scrollView是不可滚动,也会根据safeAreaInsets超出范围进行调整。(具体效果可以试着自己上手调试,这里就不贴代码和示意图了)。