【问题标题】:Hide status bar but not custom UIWindow隐藏状态栏但不自定义 UIWindow
【发布时间】:2017-08-14 22:17:40
【问题描述】:

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

override var prefersStatusBarHidden: Bool {
    return true
}

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

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

如何隐藏状态栏而不隐藏我的自定义 UIWindow?

【问题讨论】:

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

标签: ios swift uiwindow ios7-statusbar


【解决方案1】:

编辑:更好的解决方案

与之前/下面一样仍然适用,但实际代码更短、更简单且更 Swifty。

在你的 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
}

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

【讨论】:

    猜你喜欢
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 2016-09-04
    • 2014-01-29
    • 1970-01-01
    • 2014-10-14
    相关资源
    最近更新 更多