6

当我在 ios13 xcode11 beta 上运行我的项目时。

[UIApplication sharedApplication].statusBarFrame.size.height

代码返回 0。

我应该怎么做才能使其适应 ios13 ?

4

4 回答 4

2

iOS13中使用UIStatusBarManager获取statusBar高度:

UIStatusBarManager *manager = [UIApplication sharedApplication].keyWindow.windowScene.statusBarManager;

CGFloat height = manager.statusBarFrame.size.height;
于 2019-07-18T06:42:54.453 回答
0

SceneDelegate.swift 文件

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

    guard let windowScene = (scene as? UIWindowScene) else { return }
    if let statusBarFrame = windowScene.statusBarManager?.statusBarFrame {
        print(statusBarFrame)
    }
}
于 2019-08-21T05:50:29.850 回答
0

解决方案:

let window = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
lazy var statusBarHeight = window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0

解释 :

您不能window在 a中使用,let因为它在创建该属性时不存在,因为它属于 self。所以在init,self还没有完成。但是如果你使用 a lazy var,那么self它的属性window会在你需要的时候准备好。

或其他解决方案使用singleton

struct AppConstants {
    static let window = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
    static let statusBarHeight = window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
}
于 2020-07-24T03:23:06.880 回答
0

正如彼得Tamarous 的回答中指出的那样,不推荐使用keyWindow属性,但是假设您使用的是单个窗口,您也可以使用:

CGSize statusBarSize = [UIApplication sharedApplication].windows.firstObject.windowScene.statusBarManager.statusBarFrame.size

如果您需要访问第n 个窗口,您可以以类似的方式进行:

NSInteger i = 0;
CGSize statusBarSize = [UIApplication sharedApplication].windows[i].windowScene.statusBarManager.statusBarFrame.size;
于 2019-09-22T22:02:42.313 回答