Skoua 的回答可能在某些情况下有效,但对 iOS11 及更高版本确实有一定的副作用。最值得注意的是,滚动视图将开始向其子级传播安全区域,如果您使用安全区域或布局边距,这可能会在滚动时弄乱您的布局。
Apple 在这个 WWDC 会议中很好地详细解释了这一点,并且还明确提到它contentInsetAdjustmentBehavior = .never
可能会产生副作用,并且在大多数情况下不应该使用。
要获得一个不会弄乱我们的布局但在状态栏(或导航栏)下方显示其内容的滚动视图,您应该观察滚动视图的安全区域并相应地调整您的自定义内容插图:
private var scrollViewSafeAreaObserver: NSKeyValueObservation!
override func viewDidLoad() {
...
if #available(iOS 11.0, *) {
self.scrollViewSafeAreaObserver = self.scrollView.observe(\.safeAreaInsets) { [weak self] (_, _) in
self?.scrollViewSafeAreaInsetsDidChange()
}
} else {
self.automaticallyAdjustsScrollViewInsets = false
}
}
@available(iOS 11.0, *)
func scrollViewSafeAreaInsetsDidChange() {
self.scrollView.contentInset.top = -self.scrollView.safeAreaInsets.top
}
deinit {
self.scrollViewSafeAreaObserver?.invalidate()
self.scrollViewSafeAreaObserver = nil
}
为什么这行得通?因为我们离开了contentInsetAdjustmentBehavior = .automatic
。当涉及到滚动和非滚动轴时,这将为我们提供正常的行为,但 UIScrollView 也会将任何安全区域“转换”为内容插入。由于我们不希望它用于我们的顶部边缘,我们只需将负顶部安全区域设置为我们的自定义插入,这将抵消滚动视图设置的任何插入。