模态视图消失后状态栏仍然隐藏,几秒钟后才会出现

7

我有一个非常奇怪的行为:

我有一个带有导航控制器(导航栏)的应用程序,其中状态栏可见。然后,我以模态方式呈现视图控制器(使用相机的条形码扫描器),我想隐藏状态栏,因此我实现了以下内容:

override func prefersStatusBarHidden() -> Bool {
    return true
}

当我使用模态呈现视图并关闭它时,可以使用以下代码:
self.dismissViewControllerAnimated(true, completion: nil)

即使rootviewcontroller实现了视图,视图仍然消失并且状态栏保持隐藏。

override func prefersStatusBarHidden() -> Bool {
    return false
}

但是几秒钟后状态栏会自动出现?我在StackOverflow上找到了一个解决方案,我尝试了一下:
UIApplication.sharedApplication().setStatusBarHidden(false, withAnimation: UIStatusBarAnimation.Fade)
self.dismissViewControllerAnimated(true, completion: nil)

但是这对我来说并没有改变什么。

也许我可以在viewDidAppear中刷新root view?


1
你看过 setNeedsStatusBarAppearanceUpdate 吗? - jrturton
嘿,兄弟,我有完全相同的问题,我尝试了所有函数来强制状态栏出现。你最终找到解决办法了吗? - Swift Everyday
很遗憾不行 :( - mahega
2个回答

8

您是否可能在后台线程中调用了dismissViewControllerAnimated

如果是这样,请尝试将此调用(以及任何其他对UIKit的调用,因为它不是线程安全的)包装在返回主队列的GCD回调中,如下所示:

dispatch_async(dispatch_get_main_queue()) {
 self.dismissViewControllerAnimated(true, completion: nil)
}

在 Swift 3 中,DispatchQueue.main.async - Erik Johnson

2
您可能需要在您的视图控制器中调用setNeedsStatusBarAppearanceUpdate方法:

如果视图控制器的状态栏属性(例如隐藏/显示状态或样式)发生更改,请调用此方法。如果您在动画块内调用此方法,则更改将与其余动画块一起进行动画处理。

通常,这是在viewDidLoad中完成的,但在您的情况下,最好在viewDidAppear中完成,因为您的视图已经加载并且您正在关闭视图层次结构中的一个视图。请尝试以下操作:

override func viewDidAppear(animated: Bool) {
    self.setNeedsStatusBarAppearanceUpdate()
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接