导航栏在隐藏时没有动画,但在重新出现时仍然有动画
Navbar not animating while hiding but still animates while reappearing
我按照 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
}
试试这个:
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
}
}
以下 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 的状态栏和导航栏。
问题是在 iOS 11 navigationController?.isNavigationBarHidden 中总是 returns false。在 iOS 10 中,此代码工作正常。我还没有找到解决方法 (((
我按照 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
}
试试这个:
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
}
}
以下 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 的状态栏和导航栏。
问题是在 iOS 11 navigationController?.isNavigationBarHidden 中总是 returns false。在 iOS 10 中,此代码工作正常。我还没有找到解决方法 (((