快速隐藏状态栏 4

Posted

技术标签:

【中文标题】快速隐藏状态栏 4【英文标题】:hide status bar swift 4 【发布时间】:2018-03-14 14:01:45 【问题描述】:

我试图在我的一个 UIViewControllers (Swift 4) 中隐藏状态栏。

首先,我在Info.plist 中将基于控制器的状态栏外观设置为YES

我覆盖了控制器中的 prefersStatusBarHidden 属性:


override var prefersStatusBarHidden: Bool 
     return true


viewDidLoad() 中,我添加了setNeedsStatusBarAppearanceUpdate() 函数来强制读取prefersStatusBarHidden 属性。

毕竟,我仍然看到UIViewController 上的状态栏。

有人可以帮帮我吗?

【问题讨论】:

也许如果你添加一些代码会有助于做出答案 看到这个***.com/questions/38876249/… @Anbu.Karthik 您链接的答案是 OP 已经完成的事情。 我已经尝试了@Anbu.Karthik 评论中提到的所有内容 你使用的是 UIPageViewController 还是其他视图层次结构? 【参考方案1】:

您可以通过添加以下代码来隐藏任何或所有视图控制器中的状态栏:

override var prefersStatusBarHidden: Bool 
     return true
   

任何包含该代码的视图控制器都会默认隐藏状态栏。

如果你想为状态栏设置动画,只需在视图控制器上调用 setNeedsStatusBarAppearanceUpdate() - 这将强制再次读取 prefersStatusBarHidden,此时点您可以返回不同的值。如果您愿意,您对 setNeedsStatusBarAppearanceUpdate() 的调用实际上可以在动画块内,这会导致状态栏以平滑的方式隐藏或显示。

【讨论】:

我尝试了所有这些,甚至 UIApplication.shared.isStatusBarHidden = true 在 vi​​ewDidLoad() 中,但状态栏仍然存在...我阅读了 swift 4 更改日志,并且没有任何关于更改 prefersStatusBarHidden 的内容。 . 我在我的 Swift 4 项目中所做的只是添加了上面的覆盖,没有别的,它起作用了。无需更改 Info.plist 文件,无需调用 setNeedsStatusBarAppearanceUpdate() 为我工作。我没有碰plist。只需将上面的代码复制并粘贴到 UIViewController 子类中即可。【参考方案2】:

您可能已经找到了自己的解决方案,但我是这样工作的:

override func viewWillAppear(_ animated: Bool) 
    // Sets the status bar to hidden when the view has finished appearing
    let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
    statusBar.isHidden = true


override func viewWillDisappear(_ animated: Bool) 
    // Sets the status bar to visible when the view is about to disappear
    let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
    statusBar.isHidden = false

【讨论】:

这是一些有风险的代码...如果 Apple 出于某种原因更改了子类(我不会感到惊讶,他们在过去更改了更疯狂的东西),crash boom bang 如果你改用空操作符,最坏的情况就是它会出现。如果让 statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as? UIView statusBar.isHidden = false 【参考方案3】:

如果您以模态方式呈现视图控制器,请尝试

viewController.modalPresentationCapturesStatusBarAppearance = true

【讨论】:

不错!你救了我的命:)【参考方案4】:

尝试将 Info.plist 中的“查看基于控制器的状态栏外观”标志设置为“是”。这将强制应用在每个视图控制器上调用 prefersStatusBarHidden: Bool 属性。

【讨论】:

【参考方案5】:

虽然有些实现更简洁,例如:

UIApplication.shared.isStatusBarHidden = true

在过渡期间有一些奇怪的剪辑动画。虽然比较冗长,但我更喜欢@MachTurtle 的解决方案:

override func viewWillAppear(_ animated: Bool) 
        super.viewWillAppear(true)
        if let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as? UIView
        statusBar.isHidden = true
        


override func viewWillDisappear(_ animated: Bool) 
    super.viewWillDisappear(true)
    let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
    statusBar.isHidden = false

试试看,对我很有用。

【讨论】:

这是一些有风险的代码...如果 Apple 出于某种原因更改了子类(我不会感到惊讶,他们在过去更改了更疯狂的东西),crash boom bang【参考方案6】:

使用以下代码 UIApplication.shared.isStatusBarHidden = true

这是我发现的唯一在 ios11 中工作的东西。 你可以写在didFinishLaunchingWithOptions或你的'viewWillAppear'BaseViewController 享受吧。

【讨论】:

【参考方案7】:

正如您所说,您正在使用 UINavigationController 导航到您的自定义视图控制器。我想您已将自定义视图控制器设置为 UINavigationController 的根视图。在这种情况下,在您的自定义视图控制器中覆盖 var prefersStatusBarHidden 将不起作用,但您必须继承您的 UINavigation 控制器并覆盖那里的属性,如下所示:-

class CustomNavigationController: UINavigationController 

    override var prefersStatusBarHidden: Bool 
        return true
    


【讨论】:

【参考方案8】:

我发现 prefersStatusBarHidden 没有在我的视图控制器中被调用,因为我使用的是自定义容器视图,我需要将状态栏隐藏职责转发给子视图控制器。如果对我来说,在容器视图控制器中实现 var childForStatusBarHidden: UIViewController? return childViewController 是固定的。

【讨论】:

【参考方案9】:

当您尝试重载 UINavigationStack 中 ViewController 的状态栏属性时 - 您需要在下面进行扩展

extension UINavigationController 
  override open var childForStatusBarStyle: UIViewController? 
    return self.topViewController
  

然后您的重载属性将变为活动状态

【讨论】:

【参考方案10】:

我正在寻找它,而我的一项工作是

斯威夫特 5

override var prefersStatusBarHidden: Bool 
  return true
 

【讨论】:

【参考方案11】:

尝试检查项目设置的常规部分下的隐藏状态栏

【讨论】:

感谢您的回答,但我不需要隐藏整个应用的状态栏,只需要一个自定义 UIViewController 此设置最初只是隐藏状态栏,有助于确保在许多情况下隐藏状态栏。【参考方案12】:

这些都不适合我在 iOS 11 中处理转换后的项目。这就是我所做的。我在 AppDelegate 中添加了这段代码

func application(_ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool

    application.isIdleTimerDisabled = true
    application.isStatusBarHidden = true
    return true

【讨论】:

【参考方案13】:

只需将视图的“顶部空间”约束从安全区域更改为超级视图。它会将您的视图拖到状态栏下,因此无需隐藏它 ]1

【讨论】:

【参考方案14】:

如果是子视图控制器需要在容器视图控制器中编写代码

     override var prefersStatusBarHidden: Bool 
      return true
     

【讨论】:

【参考方案15】:

将此添加到您的 info.plist

<key>UIStatusBarHidden</key>
    <true/>

【讨论】:

这会隐藏整个应用程序的状态栏。问题是针对一种观点。

以上是关于快速隐藏状态栏 4的主要内容,如果未能解决你的问题,请参考以下文章

Android全屏(包含3种隐藏顶部状态栏及标题栏和一种隐藏Android 4.0平板底部状态栏的方法)

Android全屏(包含3种隐藏顶部状态栏及标题栏和一种隐藏Android 4.0平板底部状态栏的方法)

在 android 4.4+ 或 kitkat 中隐藏状态栏

如何在 Android 4 中隐藏状态栏

安卓11小窗模式下隐藏状态栏

Android 完全隐藏状态栏方法