iPhone X 下关闭 UIScrollView 自动调整 ContentInset

  • Post author:
  • Post category:IT
  • Post comments:0评论

项目开发了三分之一,才想到在 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 的排版布局破坏性最大的一个版本,接下去我应该还会分享好几篇相关适配文章。

本站架设于Linode 东京机房

发表回复