簡體   English   中英

iOS11設備上safeAreaInset的不同返回沒有缺口

[英]Different return of safeAreaInset on iOS11 device without notch

目前我正在使用以下代碼段來獲取 safeAreaInset.top 值來為我的視圖設置約束。

extension UIDevice {
     var safeAreaInsets: UIEdgeInsets {
         if #available(iOS 11.0, *) {
             if let keyWindow = UIApplication.shared.windows.filter({ $0.isKeyWindow}).first {
                 return keyWindow.safeAreaInsets
             }
         }
         return UIEdgeInsets.zero
     }
}

在具有 iOS 12 或更高版本的 iPhone 上,safeAreaInsets 似乎做得很好,為沒有缺口的設備返回UIEdgeInsets(20, 0, 0, 0)為有缺口的設備UIEdgeInsets(47, 0, 34, 0)

但是在 iOS 11 上,safeAreaInset 始終為沒有缺口的設備返回UIEdgeInsets(0, 0, 0, 0)

我在沒有缺口的不同尺寸設備(iPhone7、iPhone8、iPhone8 Plus)上嘗試過,它們只在 iOS 11 版本(11.2、11.4 等)上返回UIEdgeInset(0, 0, 0, 0) ,但返回正確的UIEdgeInset(20, 0, 0, 0)在其他 iOS 11+ 版本上。 (在帶有缺口的設備上,它們似乎為所有 iOS 11 或更高版本返回了正確的 safeAreaInset UIEdgeInset(47, 0, 34, 0) 。)

我的問題是,為什么 safeAreaInset 僅在沒有缺口的 iOS 11 設備上返回不同,以及獲取 safeAreaInset 的適當方法是什么。

首先在您的 AppDelegate 中聲明 window,如下所示:

var window: UIWindow?

您可以像這樣獲得 safeAreaInsets:

let _appDelegator = { return UIApplication.shared.delegate! as! AppDelegate }()

var _safeAreaInsets: UIEdgeInsets {
    get {
        if let window = _appDelegator.window{
            return window.safeAreaInsets
        }else if let vc = _appDelegator.window?.rootViewController{
            return vc.view.safeAreaInsets
        }
        return UIEdgeInsets.zero
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM