【问题标题】:Status bar height in SwiftSwift 中的状态栏高度
【发布时间】:2014-11-16 09:34:06
【问题描述】:

如何在 Swift 中以编程方式获取状态栏的高度?

在 Objective-C 中是这样的:

[UIApplication sharedApplication].statusBarFrame.size.height.

【问题讨论】:

    标签: ios swift statusbar


    【解决方案1】:

    Swift 2.x有什么问题吗:

    UIApplication.sharedApplication().statusBarFrame.size.height
    

    Swift 3 或 Swift 4

    UIApplication.shared.statusBarFrame.height
    

    确保 UIKit 已导入

    import UIKit
    

    在 iOS 13 中,您将收到弃用警告”

    'statusBarFrame' 在 iOS 13.0 中已弃用:使用 statusBarManager 而是窗口场景的属性。

    解决这个问题:

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

    【讨论】:

    • Swift 3 的新语法:UIApplication.shared.statusBarFrame.size.height
    • 你可以在 Swift 3 中省略 sizeUIApplication.shared.statusBarFrame.height 就足够了。
    • 让 height = view.window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0 实际上返回 0
    • @Invincible_Pain 可能是因为你当前的窗口还没有加载,所以把view.window?替换成UIApplication.shared.keyWindow?
    • 让 height = view.window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0 不再起作用了
    【解决方案2】:

    更新的答案支持 iOS 13+ 和更早的 iOS 版本的 Swift 5

     func getStatusBarHeight() -> CGFloat {
        var statusBarHeight: CGFloat = 0
        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
        }
        return statusBarHeight
    }
    

    编码愉快!

    【讨论】:

    • 稍作调整,使其成为静态变量,然后访问更加清晰,即。 UIApplication.statusBarHeight
    • 它实际上是作为一个全局函数来实现的。如果我将它包装在一个类中,制作一个静态变量会很方便。
    【解决方案3】:

    这是我用的:

    struct Screen {
    
     static var width: CGFloat {
      return UIScreen.main.bounds.width
     }
    
     static var height: CGFloat {
      return UIScreen.main.bounds.height
     }
    
     static var statusBarHeight: CGFloat {
      let viewController = UIApplication.shared.windows.first!.rootViewController
      return viewController!.view.window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
     }
    
    }
    

    那么你可以这样做:

    Screen.statusBarHeight
    

    【讨论】:

      【解决方案4】:

      Swift 只是一种不同的语言。 API 元素是相同的。也许是这样的:

      let app = UIApplication.sharedApplication()
      let height = app.statusBarFrame.size.height
      

      【讨论】:

        【解决方案5】:

        易卜拉欣重新设计的答案:

        extension UIApplication {
            static var statusBarHeight: CGFloat {
                if #available(iOS 13.0, *) {
                    let window = shared.windows.filter { $0.isKeyWindow }.first
                    return window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
                } 
                
                return shared.statusBarFrame.height
            }
        }
        

        【讨论】:

          【解决方案6】:

          就像在 Objective-C 中一样:

          var screenStatusBarHeight: CGFloat {
              return UIApplication.sharedApplication().statusBarFrame.height
          }
          

          这是作为标准变量包含在:

          https://github.com/goktugyil/EZSwiftExtensions

          【讨论】:

            【解决方案7】:

            我正在使用 iOS 15 iPhone(iPad 可能需要一些工作)。我使用的摆脱了已弃用警告的代码如下:

            func getStatusBarHeight() -> CGFloat {
                var statusBarHeight: CGFloat = 0
                let scenes = UIApplication.shared.connectedScenes
                let windowScene = scenes.first as? UIWindowScene
                let window = windowScene?.windows.first
                statusBarHeight = window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
                return statusBarHeight
            }
            

            【讨论】:

              【解决方案8】:

              在我的 swiftUI 项目中,这很有效。

              import UIKit
              import SwiftUI
              
              class SceneDelegate: UIResponder, UIWindowSceneDelegate {
                  
                  var window: UIWindow?
              
                  func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
                      let contentView = ContentView()
                      if let windowScene = scene as? UIWindowScene {
                          let window = UIWindow(windowScene: windowScene)
                          
                          if let statusBarHeight = window.windowScene?.statusBarManager?.statusBarFrame.height {
                          SceneDelegateDataGetter.shared.height = statusBarHeight
                          }
                          
                          window.rootViewController = HostingController(rootView: contentView)
                          self.window = window
                          window.makeKeyAndVisible()
                      }
                  }
              
              class SceneDelegateDataGetter {
                  static let shared = SceneDelegateDataGetter()
                  
                  public fileprivate(set) var height: CGFloat = 0
              }
              

              使用时,

              SceneDelegateDataGetter.shared.height
              

              【讨论】:

                【解决方案9】:

                来自 Peter SuwaraBobby 的回答

                Swift 5 更新:

                extension UIApplication {
                    static var statusBarHeight: CGFloat {
                        if #available(iOS 13.0, *) {
                            let window = shared.windows.filter { $0.isKeyWindow }.first
                            return window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
                        }
                        return shared.statusBarFrame.height
                    }
                }
                
                struct ScreenUtils {
                    static var width: CGFloat {
                        return UIScreen.main.bounds.width
                    }
                    
                    static var height: CGFloat {
                        return UIScreen.main.bounds.height
                    }
                    
                    static var statusBarHeight: CGFloat {
                        return UIApplication.statusBarHeight
                    }
                }
                

                使用:

                ScreenUtils.statusBarHeight
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2021-04-26
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-12-15
                  • 2011-03-25
                  • 1970-01-01
                  • 2011-04-22
                  相关资源
                  最近更新 更多