如何在iOS 13中获取状态栏的高度?

Jor*_*n H 11 ios ios13

在iOS 13中UIApplication.shared.statusBarFrame.height警告

在iOS 13.0中不建议使用“ statusBarFrame”:而是使用窗口场景的statusBarManager属性。

在iOS 13中如何在不使用不推荐使用的API的情况下获取状态栏的高度?

小智 25

试试吧,我试过了。

let window = UIApplication.shared.windows.filter {$0.isKeyWindow}.first        
let height = window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
Run Code Online (Sandbox Code Playgroud)

  • keyWindow 现在也已弃用 (10认同)

Jor*_*n H 20

如警告提示所示,您可以访问statusBarManager具有statusBarFrame属性的。这是在您UIWindow的上定义的windowScene

let height = view.window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0

  • 如果您在应用启动后不久使用它,它将返回nil,而旧方法将返回正确的值。有什么建议么? (3认同)
  • @jordan H,这在 Xcode 11.3 中的 iOS 13.3 中不起作用,您能否对此进行更新。 (2认同)

Den*_*Den 18

UIApplication.shared.windows在 iOS 15.0 中已弃用

iOS 15

 let statusBarHeight = UIApplication.shared.connectedScenes
        .filter {$0.activationState == .foregroundActive }
        .map {$0 as? UIWindowScene }
        .compactMap { $0 }
        .first?.windows
        .filter({ $0.isKeyWindow }).first?
        .windowScene?.statusBarManager?.statusBarFrame.height ?? 0
Run Code Online (Sandbox Code Playgroud)


Üma*_*mån 13

解决方案:

这似乎在 iPhoneX+ 设备中也没有任何警告地工作。

斯威夫特 4.2 / 5

if #available(iOS 13.0, *) {
    let window = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
    statusBarHeight = window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
} else {
    statusBarHeight = UIApplication.shared.statusBarFrame.height
}
Run Code Online (Sandbox Code Playgroud)

尝试一下。希望能帮助到你。


小智 7

我遇到了与 MMV 相同的问题(请参阅他们对 Jordan H 回答的评论),view.window?.windowScene?.statusBarManager?.statusBarFrame.height在我的应用程序启动附近返回 nil。具体view.window返回nil。然后我尝试在 UIApplication.shared 上搜索 windows 属性:

for window in UIApplication.shared.windows
Run Code Online (Sandbox Code Playgroud)

在我的情况下,这返回了两个窗口。两个窗口具有相同的非零状态栏高度。我不确定为什么有两个窗口,但至少两个窗口都有相同的状态栏高度。我像这样访问状态栏高度:

if let height = window.windowScene?.statusBarManager?.statusBarFrame.height
Run Code Online (Sandbox Code Playgroud)

我决定在我的情况下,因为可能有不同的高度来为我的代码取最大的高度。这是我用于我的应用程序的代码:

let statusBarHeight: CGFloat = {
    var heightToReturn: CGFloat = 0.0
         for window in UIApplication.shared.windows {
             if let height = window.windowScene?.statusBarManager?.statusBarFrame.height, height > heightToReturn {
                 heightToReturn = height
             }
         }
    return heightToReturn
}()
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助某人!

  • 它确实对我有很大帮助!谢谢! (2认同)

小智 6

var statusBarHeight: CGFloat = 0
if #available(iOS 13.0, *) {
    statusBarHeight = UIApplication.shared.keyWindow?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
} else {
    statusBarHeight = UIApplication.shared.statusBarFrame.height
}
Run Code Online (Sandbox Code Playgroud)

  • iOS 13 中也已弃用“keyWindow” (3认同)