【发布时间】:2014-12-04 02:28:55
【问题描述】:
如何在iphone中像照片一样点击设备时隐藏状态栏和导航栏? 我用过
UIApplication.sharedApplication().setStatusBarHidden(false, withAnimation: UIStatusBarAnimation.Slide)
但它不起作用。
编辑:我想隐藏和显示状态栏和导航栏,而不是永久隐藏。
【问题讨论】:
如何在iphone中像照片一样点击设备时隐藏状态栏和导航栏? 我用过
UIApplication.sharedApplication().setStatusBarHidden(false, withAnimation: UIStatusBarAnimation.Slide)
但它不起作用。
编辑:我想隐藏和显示状态栏和导航栏,而不是永久隐藏。
【问题讨论】:
在 Swift 5 和 iOS 12 中,您可以根据需要选择以下三个代码 sn-ps 之一来解决您的问题。
UINavigationController hidesBarsOnTap 属性 + UIViewController prefersStatusBarHidden 和 preferredStatusBarUpdateAnimation 属性从 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
}
}
UINavigationController setNavigationBarHidden(_:animated:) 方法 + UIViewController prefersStatusBarHidden 和 preferredStatusBarUpdateAnimation 属性与 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
}
}
UINavigationController setNavigationBarHidden(_:animated:) 方法 + UIViewController prefersStatusBarHidden 和 preferredStatusBarUpdateAnimation 属性与 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
}
}
UIViewControllerBasedStatusBarAppearance设置为true,否则之前的示例代码将不起作用。【讨论】:
prefersStatusBarHidden() 与导航栏的可见性一起使用时,导航栏在隐藏时不会动画(幻灯片),但在显示幻灯片时仍然会动画.还没有找到解决此问题的方法。
automaticallyAdjustsScrollViewInsets = false
在 iOS 8 及更高版本上,您可以简单地使用hidesBarsOnTap:
navigationController?.hidesBarsOnTap = true
【讨论】:
令人震惊的是,这个问题在 6 年后仍然存在。我已经按照this answer 中的描述提交了一个错误。您最好的选择是使用旧的(在 iOS 9 中已弃用)API 和问题中提到的 OP,并结合 UINavigationController.setNavigationBarHidden()。或者你牺牲了动画。
【讨论】: