10

我正在调整一个应用程序以支持 iPhone X。我有一个带有自定义视图控制器的共享扩展。我需要知道我的设备的安全区域插图,但是通过调用提供的safeAreaInsets方法在共享扩展中不可用,因为在那里不可见。有没有办法知道我的共享扩展中的属性值?UIWindowUIApplication.shared.keyWindowUIApplication.sharedsafeAreaInsets

4

1 回答 1

7

safeAreaInsets是任何 UIView 上的属性;您可以在您的共享扩展中使用它。您不需要要求UIApplication.shared.keyWindowsafeAreaInsets - 事实上,您可能不想这样做,因为如果 keyWindow 包含 aUINavigationController或 a UITabBarController,它们会影响 safeAreaInsets。

如果您的UIView层次结构中有一个视图,它safeAreaInsets的计算方法是查看层次结构中的祖先视图,并查看它们中是否有任何safeAreaInsets与您的视图重叠。

但是,您可能会发现safeAreaInsets最初是UIEdgeInsets.zero- 您想要做的是实现UIView.safeAreaInsetsDidChange()or UIViewController.viewSafeAreaInsetsDidChange(),如下所示:

public override func safeAreaInsetsDidChange() {
    if #available(iOS 11.0, *) {
        super.safeAreaInsetsDidChange()
        self.setNeedsUpdateConstraints() // or self.setNeedsLayout, etc.
    }
}
于 2017-11-02T19:54:59.203 回答