ios - UIScrollView 是否会自动调整 contentOffset 以适应安全区域?
问题描述
我添加了一个 UIScrollView 和 3 个 UIView。
我已经三次检查了 UIScrollView 的框架、UIViews 的框架、它的 contentOffset、superview 的框架,通常所有相关的内容。
出于某种原因,这就是我将 contentOffset 设置为 (0,0) 时出现的情况:
我的项目中没有从该偏移原点开始的视图。
scrollView 假设 (0, 0) 大约是 (0, 50) ,这是导航栏的高度,即使我没有使用导航栏。
编辑
奇怪的是,如果我在设备处于横向模式时打开应用程序,contentOffset 行为正常。因此,由于设备的下巴,它必须进行一些自动调整。
编辑 2
我在没有下巴的设备(iPhone 8)上打开了应用程序,然后 contentOffset 会自动调整到状态栏的高度。含义 (0, 0) 不是 (0, 0) 而是 (0, heightOfStatusBar)。
编辑 3
在 iPad 上,即使 iPad 确实有状态栏,它也会正常运行!
在每种情况下,如何将其修复为 (0,0) ?
解决方案
UIScrollView
具有“插入”内容的属性,因此安全区域不会重叠。
可以通过设置实例的contentInsetAdjustmentBehavior
属性来更改它,如下所示:UIScrollView
scrollView.contentInsetAdjustmentBehavior = .never
请注意,它不是contentOffset
,而是contentInset
经过调整的。(0, 0)
这就是为什么在所有情况下内容偏移量仍然存在的原因。
此外,如果您正在为低于 iOS 11.0 的 iOS 开发目标进行构建,您可能会收到构建错误。在这种情况下,您可以改用以下代码。
if #available(iOS 11.0, *){
scrollView.contentInsetAdjustmentBehavior = .never
}
参考
推荐阅读
- angular - 如何在自定义 Angular 组件中禁用 ngModel 的默认行为?
- python - 使用 Holoviews Holomap 绘制各天的堆积面积图
- node.js - [:^punct] 的 Postgresql 无效类
- laravel - Laravel Valet 共享错误:“dial tcp [...] no such host”
- php - spl_autoload_register 如何在内部工作
- javascript - 未捕获的类型错误:无法读取 select2 中 null 的属性“替换”
- android - 如何使用 bitbucket-pipelines 定位 apk 文件?
- c# - 当实体在不同的项目中时,为什么 Mediatr 不解析方法?
- excel - 兰德给出#n/a
- python - 如何在读取之前清除字符串并将str转换为int