检测共享扩展上的安全区域插入

Nic*_*chi 8 share-extension ios11 safearealayoutguide iphone-x

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

bry*_*ark 5

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.
    }
}
Run Code Online (Sandbox Code Playgroud)