提问人:Vulkan 提问时间:7/31/2021 最后编辑:Vulkan 更新时间:7/31/2021 访问量:1020
UIScrollView 是否会自动调整 contentOffset 以适合安全区域?
Does the UIScrollView automatically adjust contentOffset to fit inside the safe area?
问:
我有一个 UIScrollView 和 3 个 UIViews,我添加到其中。
我已经三重检查了 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
}
引用
Apple 开发人员文档 - contentinsetadjustmentbehavior
不,contentOffset 不会影响安全区域,反之亦然。 contentOffset 用于在 scrollView 中对滚动进行编程。
如果要将 UIScrollView 链接到框架的边界,则必须使用自动布局并激活一些约束。一步一步:
- 将滚动视图的 AutoresizingMaskIntoConstraints 设置为 false scrollView.translatesAutoresizingMaskIntoConstraints = false
- 初始化约束
- 激活约束(在 viewDidLoad 中)
scrollView.translatesAutoresizingMaskIntoConstraints = false
let constraints: [NSLayoutConstraint] = [
scrollView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
scrollView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
scrollView.widthAnchor.constraint(equalTo: view.widthAnchor),
scrollView.heightAnchor.constraint(equalTo: view.heightAnchor)
]
NSLayoutConstraint.activate(constraints)
因此,您的滚动视图将链接到手机边界的边缘。并且 contentOffset 将等于 (0, 0)。相反,如果你想将 scrollView 链接到安全区域,你必须使用 view.layoutMarginsGuide,你可以在其中找到各种锚点。
每个 UIView 对象都与父视图协调系统配合使用。scrollView 对状态栏、导航栏和工具栏一无所知。例如,任何 UIView 的帧原点都是 (0,0)。
所以,总而言之:
- 若要将滚动视图链接到安全区域,需要设置约束。
- contentOffset 用于在 scrollView 中对滚动进行编程。
评论