当我在 ios13 xcode11 beta 上运行我的项目时。
[UIApplication sharedApplication].statusBarFrame.size.height
代码返回 0。
我应该怎么做才能使其适应 ios13 ?
当我在 ios13 xcode11 beta 上运行我的项目时。
[UIApplication sharedApplication].statusBarFrame.size.height
代码返回 0。
我应该怎么做才能使其适应 ios13 ?
iOS13中使用UIStatusBarManager获取statusBar高度:
UIStatusBarManager *manager = [UIApplication sharedApplication].keyWindow.windowScene.statusBarManager;
CGFloat height = manager.statusBarFrame.size.height;
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)
}
}
解决方案:
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
}
正如彼得在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;