点击设备时如何隐藏状态栏和导航栏

Posted

技术标签:

【中文标题】点击设备时如何隐藏状态栏和导航栏【英文标题】:how to hide status bar and navigation bar when tap device 【发布时间】:2014-12-04 02:28:55 【问题描述】:

如何在iphone中像照片一样点击设备时隐藏状态栏和导航栏? 我用过

UIApplication.sharedApplication().setStatusBarHidden(false, withAnimation: UIStatusBarAnimation.Slide)

但它不起作用。

编辑:我想隐藏和显示状态栏和导航栏,而不是永久隐藏。

【问题讨论】:

***.com/questions/18303746/… 【参考方案1】:

在 Swift 5 和 ios 12 中,您可以根据需要选择以下三个代码 sn-ps 之一来解决您的问题。


#1。使用 UINavigationController hidesBarsOnTap 属性 + UIViewController prefersStatusBarHiddenpreferredStatusBarUpdateAnimation 属性

从 iOS 8 开始,UINavigationController 具有 hidesBarsOnTap 属性。 hidesBarsOnTap 有以下declaration:

var hidesBarsOnTap: Bool  get set 

一个布尔值,指示导航控制器是否允许使用点击手势隐藏其栏。

苹果还声明了hidesBarsOnTap

当此属性的值为true 时,导航控制器会切换其导航栏和工具栏的隐藏和显示,以响应内容区域中未处理的点击。该属性的默认值为false

以下代码展示了如何实现hidesBarsOnTap

import UIKit

class ViewController: UIViewController 
    
    override func viewDidLoad() 
        super.viewDidLoad()
        
        navigationController?.hidesBarsOnTap = true
    
    
    override var prefersStatusBarHidden: Bool 
        return navigationController?.isNavigationBarHidden == true
    
    
    override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation 
        return UIStatusBarAnimation.slide
    
    


#2。使用 UINavigationController setNavigationBarHidden(_:animated:) 方法 + UIViewController prefersStatusBarHiddenpreferredStatusBarUpdateAnimation 属性与 UIButton

UINavigationController 有一个名为setNavigationBarHidden(_:animated:) 的方法。 setNavigationBarHidden(_:animated:) 有以下declaration:

func setNavigationBarHidden(_ hidden: Bool, animated: Bool)

设置导航栏是否隐藏。

以下代码显示了如何使用 setNavigationBarHidden(_:animated:) 和在情节提要中设置的 UIButton 并链接到 @IBAction 来切换状态栏和导航栏:

import UIKit

class ViewController: UIViewController 
    
    // Link this @IBAction to a `UIButton`
    @IBAction func toggle(_ sender: UIButton) 
        navigationController?.setNavigationBarHidden(navigationController?.isNavigationBarHidden == false, animated: true)
    
    
    override var prefersStatusBarHidden: Bool 
        return navigationController?.isNavigationBarHidden == true
    
    
    override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation 
        return UIStatusBarAnimation.slide
    
    


#3。使用 UINavigationController setNavigationBarHidden(_:animated:) 方法 + UIViewController prefersStatusBarHiddenpreferredStatusBarUpdateAnimation 属性与 UIGestureRecognizer

作为前面代码的替代方案,您可以将setNavigationBarHidden(_:animated:)UIGestureRecognizer 一起使用,而不是UIButton

import UIKit

class ViewController: UIViewController 

    override func viewDidLoad() 
        super.viewDidLoad()

        let gesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.toggle))
        view.isUserInteractionEnabled = true
        view.addGestureRecognizer(gesture)
    

    @objc func toggle() 
        navigationController?.setNavigationBarHidden(navigationController?.isNavigationBarHidden == false, animated: true)
    

    override var prefersStatusBarHidden: Bool 
        return navigationController?.isNavigationBarHidden == true
    

    override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation 
        return UIStatusBarAnimation.slide
    



确保在您的项目的Info.plist中将UIViewControllerBasedStatusBarAppearance设置为true,否则之前的示例代码将不起作用。 如果您需要针对 iOS 10,请参阅此 answer for a similar question。

【讨论】:

非常令人印象深刻。我非常喜欢这个。对我来说效果很好 这是一个很好的解决方案。我将它用于全屏图像,但是当导航栏和工具栏动画时,它会改变我图像的位置。我该如何解决?注意:我的图片在滚动视图中,我的滚动视图是屏幕的大小,不包括导航和工具栏 prefersStatusBarHidden() 与导航栏的可见性一起使用时,导航栏在隐藏时不会动画(幻灯片),但在显示幻灯片时仍然会动画.还没有找到解决此问题的方法。 @rohaldb 我有同样的问题,你找到解决方案了吗?编辑:解决方案是使用automaticallyAdjustsScrollViewInsets = false @FelixLieb 你找到解决方案了吗?【参考方案2】:

在 iOS 8 及更高版本上,您可以简单地使用hidesBarsOnTap:

    navigationController?.hidesBarsOnTap = true

【讨论】:

【参考方案3】:

令人震惊的是,这个问题在 6 年后仍然存在。我已经按照this answer 中的描述提交了一个错误。您最好的选择是使用旧的(在 iOS 9 中已弃用)API 和问题中提到的 OP,并结合 UINavigationController.setNavigationBarHidden()。或者你牺牲了动画。

【讨论】:

以上是关于点击设备时如何隐藏状态栏和导航栏的主要内容,如果未能解决你的问题,请参考以下文章

Android 显示、隐藏状态栏和导航栏

Android 弹出Dialog时隐藏状态栏和底部导航栏

iOS 7,状态栏和导航栏:像 Reeder 一样使用侧面板隐藏或滑动

隐藏状态栏和导航栏位置

在 iPhone X 上,分别控制显示/隐藏导航栏和状态栏

Android 8.0 隐藏状态栏和导航栏