UIScrollView 是否会自动调整 contentOffset 以适合安全区域?

Does the UIScrollView automatically adjust contentOffset to fit inside the safe area?

提问人:Vulkan 提问时间:7/31/2021 最后编辑:Vulkan 更新时间:7/31/2021 访问量:1020

问:

我有一个 UIScrollView 和 3 个 UIViews,我添加到其中。

我已经三重检查了 UIScrollView 的框架、UIViews 的框架、contentOffset、superview 的框架,通常所有相关内容。

出于某种原因,当我将 contentOffset 设置为 (0,0) 时会出现以下情况:

enter image description here

我的项目中没有从该偏移原点开始的视图。

scrollView 假定 (0, 0) 是 (0, 50) 左右的东西,这是导航栏的高度,即使我没有使用导航栏。

编辑

很奇怪,如果我在设备处于横向模式时打开应用程序,contentOffset 的行为会正常。因此,由于设备的下巴,它必须进行一些自动调整。

编辑 2

我在没有下巴的设备 (iPhone 8) 上打开了应用程序,然后 contentOffset 会自动调整到状态栏的高度。意思 (0, 0) 不是 (0, 0) 而是 (0, heightOfStatusBar)。

编辑 3

在 iPad 上,即使 iPad 确实有状态栏,它也能正常运行!

我如何在每种情况下将其修复为 (0,0) ?

iOS Objective-C UIViView UIDindow

评论


答:

3赞 Thisura Dodangoda 7/31/2021 #1

UIScrollView具有一个属性,用于“嵌入”内容,以便安全区域不会重叠。

可以通过设置实例的属性来更改它,如下所示:contentInsetAdjustmentBehaviorUIScrollView

scrollView.contentInsetAdjustmentBehavior = .never

请注意,它不是 ,而是经过调整的。这就是为什么在所有情况下内容偏移量仍然存在的原因。contentOffsetcontentInset(0, 0)

此外,如果要针对低于 iOS 11.0 的 iOS 开发目标进行生成,则可能会收到生成错误。在这种情况下,您可以改用以下代码。

if #available(iOS 11.0, *){
    scrollView.contentInsetAdjustmentBehavior = .never
}

引用

Apple 开发人员文档 - contentinsetadjustmentbehavior

0赞 Buxlan 7/31/2021 #2

不,contentOffset 不会影响安全区域,反之亦然。 contentOffset 用于在 scrollView 中对滚动进行编程。

如果要将 UIScrollView 链接到框架的边界,则必须使用自动布局并激活一些约束。一步一步:

  1. 将滚动视图的 AutoresizingMaskIntoConstraints 设置为 false scrollView.translatesAutoresizingMaskIntoConstraints = false
  2. 初始化约束
  3. 激活约束(在 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)。

所以,总而言之:

  1. 若要将滚动视图链接到安全区域,需要设置约束。
  2. contentOffset 用于在 scrollView 中对滚动进行编程。