15

我有一个 scrollView 包含 2 个子 viewController。您可以看到 VC2 的布局不正确。

我发现屏幕上是否还看不到视图。 safeAreaInsets始终为 0。

滚动结束时我可以打电话vc2.view.setNeedsLayout()来解决这个问题。但是在滚动结束之前布局是不正确的。

文件说_

如果视图当前未安装在视图层次结构中,或者尚未在屏幕上可见,则此属性中的边缘插入为 0。

那么我该如何解决这种情况。

在此处输入图像描述

自动布局 在此处输入图像描述 在此处输入图像描述

4

4 回答 4

12

而不是引用当前视图的 safeAreaInsets,将其设置为 UIApplication:

(UIApplication.shared.delegate?.window??.safeAreaInsets.bottom)
于 2017-09-26T04:51:01.250 回答
3

在您的子视图控制器中,如果您将视图控制器设置为additionalSafeAreaInsets等于窗口的安全区域插图,它们将根据安全区域正确布局。

viewDidLoad()我发现我必须在里面做这件事viewWillTransition(to size: CGSize, with coordinator: UIVIewControllerTransitionCoordinator

在你的内部,viewWillTransition你会想要additionalSafeAreaInsets在协调器的动画块中设置:

coordinator.animate(alongsideTransition: { _ in
    if #available(iOS 11.0, *) {
        self.additionalSafeAreaInsets = UIApplication.shared.delegate?.window??.safeAreaInsets
    }
}, completion: nil)
于 2018-10-03T13:50:15.520 回答
2

我正在构建一个自定义分页视图控制器并且@PowHU也遇到了这个问题。

似乎对我有用的唯一解决方案是将情节提要中视图控制器的视图类设置为我创建的名为AlwaysSafeAreaInsetsView.

import UIKit

class AlwaysSafeAreaInsetsView: UIView {

    @available(iOS 11.0, *)
    override var safeAreaInsets: UIEdgeInsets {
        if let window = UIApplication.shared.keyWindow {
            return window.safeAreaInsets
        }
        return super.safeAreaInsets
    }

}
于 2019-08-14T20:01:29.307 回答
0

如果我正确地看到你的容器视图被固定在它的超级视图的顶部和底部。将其固定到安全区域,您的子视图控制器将正确布局。

于 2017-09-19T05:59:07.320 回答