iOS开发

iOS-全屏展示的实现

2020-01-20  本文已影响0人  棒棒德

分两种情况:

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超出范围进行调整。(具体效果可以试着自己上手调试,这里就不贴代码和示意图了)。

上一篇下一篇

猜你喜欢

热点阅读