UIScrollView是否自动调整contentOffset适配安全区域?如何固定为(0,0)?
问题原因
这是iOS系统默认的UIScrollView安全区域适配机制导致的。系统会自动根据当前页面的安全区域插入值,动态修改UIScrollView的contentInset属性,你看到的偏移量本质就是系统自动添加的顶部contentInset值:
- 刘海屏竖屏时顶部安全区域包含刘海+状态栏高度,对应偏移约50
- 非刘海屏iPhone竖屏时顶部安全区域仅包含状态栏高度,对应偏移20左右
- 横屏时iPhone顶部安全区域插入值为0,因此表现正常
- iPad的安全区域适配规则与iPhone不同,默认不会给scrollView添加额外顶部内边距,因此表现正常
解决方案
方案1:完全关闭自动内边距调整(最常用)
直接禁用系统对scrollView的自动内边距调整即可,所有场景下设置contentOffset = (0,0)都会对应实际坐标原点。
- iOS 11及以上版本,直接设置scrollView属性:
Swift代码:
Objective-C代码:scrollView.contentInsetAdjustmentBehavior = .neverself.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; - 如需兼容iOS 10及更低版本,还需要在对应ViewController中添加配置:
Swift代码:
Objective-C代码:automaticallyAdjustsScrollViewInsets = falseself.automaticallyAdjustsScrollViewInsets = NO;
方案2:仅禁用顶部自动调整(保留其他方向安全区适配)
如果你需要保留底部、左右侧的安全区域适配,只需要手动重置顶部内边距为0即可:
// Swift示例 scrollView.contentInset = UIEdgeInsets( top: 0, left: scrollView.contentInset.left, bottom: scrollView.contentInset.bottom, right: scrollView.contentInset.right )
额外检查项
如果你用Auto Layout布局scrollView,需要确认scrollView的顶部约束是锚定到父视图的顶部,而非父视图的安全区域顶部,否则scrollView本身的frame就会从安全区域下方开始,即便contentOffset设置为0也会出现偏移。
内容的提问来源于stack exchange,提问作者Vulkan
相关产品推荐
相关产品推荐

