Swift 中的状态栏高度

问题描述 投票:0回答:10

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

在Objective-C中,是这样的:

[UIApplication sharedApplication].statusBarFrame.size.height.
ios swift statusbar
10个回答
275
投票

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

25
投票

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

 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
}

快乐编码!


8
投票

这是我用的:

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

7
投票

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

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

4
投票

易卜拉欣的修改答案:

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
    }
}

2
投票

就像在 Objective-C 中一样:

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

这作为标准变量包含在:

https://github.com/goktugyil/EZSwiftExtensions


1
投票

我正在使用 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
}

0
投票

在我的 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

0
投票

来自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

0
投票
    guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
          let statusBarManager = windowScene.statusBarManager
    else {
        return
    }

    let statusBarHeight = statusBarManager.statusBarFrame.height
    print("Status bar height is \(statusBarHeight)")
© www.soinside.com 2019 - 2024. All rights reserved.