【问题标题】:Does the UIScrollView automatically adjust contentOffset to fit inside the safe area?UIScrollView 是否会自动调整 contentOffset 以适应安全区域?
【发布时间】:2021-10-06 14:26:40
【问题描述】:

我有一个 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) ?

【问题讨论】:

    标签: ios objective-c uiview uiscrollview


    【解决方案1】:

    UIScrollView 具有“插入”内容的属性,因此安全区域不会重叠。

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

    scrollView.contentInsetAdjustmentBehavior = .never
    

    请注意,调整的不是contentOffset,而是contentInset。这就是为什么在所有情况下内容偏移量仍然是(0, 0)

    此外,如果您正在为低于 iOS 11.0 的 iOS 开发目标进行构建,您可能会收到构建错误。在这种情况下,您可以改用以下代码。

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

    参考文献

    Apple Developer Docs - contentinsetadjustmentbehavior

    【讨论】:

      【解决方案2】:

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

      如果你想将 UIScrollView 链接到框架的边界,你必须使用 Autolayout 并激活一些约束。一步一步:

      1. 设置属性 translatesAutoresizingMaskIntoConstraints 的滚动视图为 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 中编程滚动。

      【讨论】:

        猜你喜欢
        • 2021-10-31
        • 1970-01-01
        • 2012-10-13
        • 2011-09-25
        • 1970-01-01
        • 2016-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多