Ios 隐藏状态栏但不隐藏自定义窗口

Ios 隐藏状态栏但不隐藏自定义窗口,ios,swift,uiwindow,ios7-statusbar,Ios,Swift,Uiwindow,Ios7 Statusbar,我有一个自定义的UIWindow,它是我自己的状态栏,所以我想隐藏状态栏并显示我的状态栏。我有 override var prefersStatusBarHidden: Bool { return true } 在我的UIWindow的rootViewController和主ViewController中。这会隐藏状态栏,但也会隐藏我的UIWindow。我的UIWindow的windowLevel是UIWindowLevelStatusBar+1,但我测试了其他windowLevel并

我有一个自定义的UIWindow,它是我自己的状态栏,所以我想隐藏状态栏并显示我的状态栏。我有

override var prefersStatusBarHidden: Bool {
    return true
}
在我的UIWindow的rootViewController和主ViewController中。这会隐藏状态栏,但也会隐藏我的UIWindow。我的UIWindow的
windowLevel
UIWindowLevelStatusBar+1
,但我测试了其他
windowLevel
并将其隐藏,而与级别无关

为自定义UIWindow设置不透明背景不是一个选项

如何隐藏状态栏而不隐藏自定义窗口

编辑:更好的解决方案 与前面/下面相同,但实际代码更短、更简单、更快速

在AppDelegate中,使用

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    myStatusBarWindow.isHidden = false
    return true
}
当然,还可以隐藏系统状态栏。可以在build settings或info.plist中执行此操作,也可以在视图控制器中执行此操作,例如

override var prefersStatusBarHidden: Bool {
    return true
}
好多了:)


旧解决方案

不幸的是,我找不到最好的答案,但我有一个解决办法:

首先展示你的窗户。只有在这之后,才应该隐藏状态栏。我不知道为什么会这样,但确实如此。您可以这样做:

// Class var 
var statusBarHidden = false

// For example in viewDidLoad but only the order matters
override func viewDidLoad() {
    myWindow.isHidden = false
    statusBarHidden = true
    setNeedsStatusBarAppearanceUpdate()
}

override var prefersStatusBarHidden: Bool {
    return statusBarHidden
}

通过实验,我发现
prefersStatusBarHidden
viewDidLoad
之前被选中。因此,我们需要告诉视图控制器在显示窗口后再次检查。再说一遍,我不知道为什么会这样,但确实如此。如果有人能解释这个现象(为什么这个顺序很重要),那将是这个解决方案的一个很好的补充。

您可以选择只在特定的视图控制器中隐藏它吗?@MarcioRomeroPatrnogic,我可以在所有视图控制器上隐藏,也可以在特定视图控制器上隐藏:它没有matter@MarcioRomeroPatrnogic,可能是模拟器有问题吗?我现在无法在我的设备上进行测试。我想你只有在尝试时才会发现:(@MarcioRomeroPatrnogic,我刚刚尝试过,但它在设备上也不起作用:(有什么想法吗?当系统在代码级别读取
preferssStatusBarHidden
时,是否可以看到系统做了什么?