我关注了this answer并添加了UIGestureRecognizer
来显示或隐藏导航栏和工具栏。奇怪的是,Navbar在隐藏时不会sil but,但是当它重新出现时它仍然会滑动。工具栏一直是动画。
我将代码更改为:
override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
print("got called")
return UIStatusBarAnimation.slide
}
看它是否被隐藏并被调用时被调用。我也尝试将automaticallyAdjustsScrollViewInsets
设置为假,如同相同答案的评论所示,但仍然没有运气。
我无法在任何地方找到有关此问题的任何信息。
编辑:这是我的完整代码:
override func viewDidLoad(){
super.viewDidLoad()
self.automaticallyAdjustsScrollViewInsets = false
let gesture = UITapGestureRecognizer(target: self, action: #selector(toggle))
view.isUserInteractionEnabled = true
view.addGestureRecognizer(gesture)
}
func toggle() {
navigationController?.setNavigationBarHidden(navigationController?.isNavigationBarHidden == false, animated: true)
navigationController?.setToolbarHidden(navigationController?.isToolbarHidden == false, animated: true)
}
override var prefersStatusBarHidden: Bool {
print("got called 1")
return navigationController?.isNavigationBarHidden == true
}
override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
print("got called 2")
return UIStatusBarAnimation.slide
}
答案 0 :(得分:1)
以下Swift 4代码适用于iOS 11但不能像iOS 10预期的那样工作。在iOS 10中使用它时,出于某种原因,导航栏在隐藏时不会生成动画并突然消失。
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let gesture = UITapGestureRecognizer(target: self, action: #selector(toggle))
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
}
}
要解决此问题,您可以使用以下ViewController
实施,该实施使用UIViewController
' setNeedsStatusBarAppearanceUpdate()
属性:
class ViewController: UIViewController {
override func viewDidLoad(){
super.viewDidLoad()
let gesture = UITapGestureRecognizer(target: self, action: #selector(toggle))
view.addGestureRecognizer(gesture)
}
private var isHidden = false
@objc func toggle() {
navigationController!.setNavigationBarHidden(!isHidden, animated: true)
isHidden = navigationController!.isNavigationBarHidden
UIView.animate(withDuration: 0.3) {
self.setNeedsStatusBarAppearanceUpdate()
}
}
override var prefersStatusBarHidden: Bool {
return isHidden
}
override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
return UIStatusBarAnimation.slide
}
}
作为替代方案,您还可以使用下面的UIViewController
实现:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad(){
super.viewDidLoad()
let gesture = UITapGestureRecognizer(target: self, action: #selector(toggle))
view.addGestureRecognizer(gesture)
}
private var isHidden: Bool = false {
willSet {
self.navigationController!.setNavigationBarHidden(!self.isHidden, animated: true)
}
didSet {
UIView.animate(withDuration: 0.3) {
self.setNeedsStatusBarAppearanceUpdate()
}
}
}
@objc func toggle() {
isHidden = !isHidden
}
override var prefersStatusBarHidden: Bool {
return isHidden
}
override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
return UIStatusBarAnimation.slide
}
}
请参阅this answer,其中显示了最多3种不同的方式来切换Swift 4和iOS 11的状态栏和导航栏。
答案 1 :(得分:0)
试试这个:
class ViewController: UIViewController {
var isHidden:Bool = false
@IBAction func clicked(sender: AnyObject) {
isHidden = !isHidden
UIView.animateWithDuration(0.5) { () -> Void in
self.setNeedsStatusBarAppearanceUpdate()
}
}
override func preferredStatusBarUpdateAnimation() -> UIStatusBarAnimation {
return UIStatusBarAnimation.Slide
}
override func prefersStatusBarHidden() -> Bool {
return isHidden
}
}
答案 2 :(得分:0)
问题是iOS 11中的navigationController?。isNavigationBarHidden总是返回false。在iOS 10中,此代码工作正常。我还没有找到解决方法((