iPhone X 下关闭 UIScrollView 自动调整 ContentInset

项目开发了三分之一,才想到在 iPhone X 上去跑一跑,一跑吓一跳,各种 UI 上的布局错误。本着尽快将问题消灭在萌芽阶段,于是接下去决定使用 iPhone X 作为默认模拟器去开发。本篇介绍修复一则非常常见的,即 UIScrollView 的 ContentInset 不对的问题。

问题是这样的

App 在 iPhone X 上模拟器打开,中间空了一大块(不重要的部分已经打码),这是怎么回事?仔细一看,我中间的 UICollectionView(即 UIScrollView)的 ContentInset 不对了,中间空着一大块。

App on iPhone X

奇怪了,虽然我已经关掉了 UIViewController 的 automaticallyAdjustsScrollViewInsets 了,为什么它还是被调整了呢?

新增 UIScrollViewContentInsetAdjustmentBehavior

原来,在 iOS 11 上,UIViewController 的 automaticallyAdjustsScrollViewInsets 已经 deprecated 了。UIScrollView 自动调整 ContentInset 的行为接下去是自己管理了,而不是让 UIViewController 来管理了。

从 iOS 11 开始,我们可以通过将 UIScrollView 的 contentInsetAdjustmentBehavior 这个新增 UIScrollViewContentInsetAdjustmentBehavior 属性,设置成 .never,来关掉对它的自动调整。当然了,这个值默认是 .automatic,也就是会根据 NavigationBar 和 TabBar 来自动调整。

于是乎,我们的项目多了一句这样的代码(除非你的项目是 iOS 11 Only 的,你可以不用这么写):

if #available(iOS 11.0, *) {
        self.collectionView.contentInsetAdjustmentBehavior = .never
}

更好的 Storyboard 方式

如果你的项目用了较多的地方需要去针对 iOS 11 设置这个属性,你会发现到处是 available 判断真是太糟心了,能不能有方便的方式?

当然有。如果你用 Storyboard 的话,直接给 UIScrollView 的那个属性,设置 Never 就好了,不用写 iOS 版本判断,只要保证 Storyboard 的最小 iOS 部署目标正确即可。

iPhone X Adjust UIScrollView content

小结

不得不说 iPhone X 是至今为止对 iOS App 的排版布局破坏性最大的一个版本,接下去我应该还会分享好几篇相关适配文章。

欢迎使用图拉鼎和他的团队开发的作品

效率控 - 聚合众多实用小工具

装机必备的高颜值工具箱,拥有超过 18 款工具,完成日常各类任务。支持 iPhone、iPad 和 macOS。

8 Comments

话说 少年 请教个问题Xcode9的 UIViewController xib 上 搞完 然后 masonry 布局会不会引起 iOS11一下设备不兼容 对这个 xib 上的属性

苹果这出尔反尔是不是跟微软学的。

发表评论后没有跳回原页面,而是给了个502,网址还是/comment/fuckoffspammer/,That's rude.

tualatrix 回复 @石樱灯笼

呃…这个可能是遇到 Bug 了😂

RealJasonQ

事实证明,使用 interface builder 不会后悔

Leave a Comment