隐藏状态栏但不隐藏自定义UIWindow

时间:2017-08-14 22:17:40

标签: ios swift uiwindow ios7-statusbar

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

override var prefersStatusBarHidden: Bool {
    return true
}

在我的UIWindow的rootViewController和主ViewController中。这会隐藏状态栏,但它也会隐藏我的UIWindow。我的UIWindow windowLevelUIWindowLevelStatusBar + 1,但我测试了其他windowLevel,无论级别如何,它都被隐藏了。

为我的自定义UIWindow设置不透明背景不是一种选择。

如何隐藏状态栏但不能隐藏自定义UIWindow?

1 个答案:

答案 0 :(得分:1)

编辑:更好的解决方案

同样的情况仍然适用于之前/之后,但实际代码更短,更简单,更快捷。

在你的AppDelegate中,有

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    myStatusBarWindow.isHidden = false
    return true
}

当然,隐藏系统状态栏。可以在构建设置或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
}

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