我关注了this answer并添加了一个 UIGestureRecognizer
来显示或隐藏导航栏和工具栏。奇怪的是,导航栏在隐藏时并没有滑动,但在重新出现时仍然滑动。工具栏一直处于动画状态。
我将代码更改为:
override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
print("got called")
return UIStatusBarAnimation.slide
}
查看隐藏时是否被调用,是否被调用。我还尝试将 automaticallyAdjustsScrollViewInsets
设置为 false,正如同一答案的评论所建议的那样,但仍然没有成功。
我在任何地方都找不到关于这个问题的任何信息。
编辑:这是我的完整代码:
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
}
最佳答案
以下 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
}
}
为了解决这个问题,您可以使用以下使用 UIViewController
的 setNeedsStatusBarAppearanceUpdate()
的 ViewController
实现属性:
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 的状态栏和导航栏。
关于ios - 导航栏在隐藏时没有动画,但在重新出现时仍然有动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45045885/