美文网首页iOS开发
iOS-全屏展示的实现

iOS-全屏展示的实现

作者: 棒棒德 | 来源:发表于2020-01-20 11:33 被阅读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超出范围进行调整。(具体效果可以试着自己上手调试,这里就不贴代码和示意图了)。

    相关文章

      网友评论

        本文标题:iOS-全屏展示的实现

        本文链接:https://www.haomeiwen.com/subject/ilhjzctx.html