如何在 Swift 中以编程方式获取状态栏的高度?
在Objective-C中,是这样的:
[UIApplication sharedApplication].statusBarFrame.size.height.
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 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
}
快乐编码!
这是我用的:
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
Swift 只是一种不同的语言。 API 元素是相同的。也许是这样的:
let app = UIApplication.sharedApplication()
let height = app.statusBarFrame.size.height
易卜拉欣的修改答案:
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
}
}
就像在 Objective-C 中一样:
var screenStatusBarHeight: CGFloat {
return UIApplication.sharedApplication().statusBarFrame.height
}
这作为标准变量包含在:
我正在使用 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
}
在我的 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
来自Peter Suwara和Bobby的回答
更新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
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)")