setStatusBarHidden(_:withAnimation :)在iOS 9中不推荐使用

我发现在iOS 9中, setStatusBarHidden(_:withAnimation:)现在已被弃用,文档中提到使用[UIViewController prefersStatusBarHidden]但如果我仍然想用幻灯片animation隐藏状态栏,iOS 9中的替代方法是什么?

参考preferredStatusBarUpdateAnimation

GIF

在这里输入图像说明

 class ViewController: UIViewController { var isHidden:Bool = false{ didSet{ UIView.animate(withDuration: 0.5) { () -> Void in self.setNeedsStatusBarAppearanceUpdate() } } } @IBAction func clicked(sender: AnyObject) { isHidden = !isHidden } override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation{ return .slide } override var prefersStatusBarHidden: Bool{ return isHidden } } 

Swift 3

  • 计算variables已经取代了一些function
  • animation函数已更新语法

 class ViewController: UIViewController { var isHidden:Bool = false @IBAction func clicked(sender: AnyObject) { isHidden = !isHidden UIView.animate(withDuration: 0.5) { () -> Void in self.setNeedsStatusBarAppearanceUpdate() } } override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { return UIStatusBarAnimation.slide } override var prefersStatusBarHidden: Bool { return isHidden } } 

通过将更新移动到didSetSwift 3语法),我清理了Leo的惊人答案。

 class ViewController: UIViewController { @IBAction func clicked(sender: AnyObject) { statusBarHidden = !statusBarHidden } var statusBarHidden = false { didSet { UIView.animate(withDuration: 0.5) { () -> Void in self.setNeedsStatusBarAppearanceUpdate() } } } override var prefersStatusBarHidden: Bool { return statusBarHidden } override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { return .slide } } 

如果你用目标c编码,下面是解决scheme:)(Leo的Objective C版本:P感谢人!!!)

声明一个variables

 bool isHidden; isHidden = false;//in viewDidload() 

然后添加这个代码,当你想隐藏状态栏

 isHidden = true; [UIView animateWithDuration:0.6 animations:^{ [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)]; }]; 

之后添加这两个方法

 -(UIStatusBarAnimation) preferredStatusBarUpdateAnimation { return UIStatusBarAnimationFade; } -(BOOL) prefersStatusBarHidden { return isHidden;} 

希望你的问题能解决(微笑)

  • SWIFT 3备选

嘿,大家,find了一个更好的方法去为Swift 3,通过使用私有variables配对与每个覆盖。 我原来的post: https : //stackoverflow.com/a/42083459/7183483

但是这是它的主题:

这是一个片段:

 override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { get { return .slide } } private var statusBarStyle : UIStatusBarStyle = .default override var preferredStatusBarStyle: UIStatusBarStyle { get { return statusBarStyle } } private var statusBarStatus : Bool = false override var prefersStatusBarHidden: Bool { get { return statusBarStatus } } 

然后我可以调用这样的函数:(这是我的例子之一,所以忽略自定义函数)。

 func sliderView(sliderView: SliderView, didSlideToPlace: CGFloat, within: CGFloat) { let val = (within - (didSlideToPlace - sliderView.upCent))/(within) print(val) //Where you would change the private variable for the color, for example. if val > 0.5 { statusBarStyle = .lightContent } else { statusBarStyle = .default } UIView.animate(withDuration: 0.5, animations: { sliderView.top.backgroundColor = UIColor.black.withAlphaComponent(val) self.coverLayer.alpha = val self.scroll.backgroundColor = colors.lightBlueMainColor.withAlphaComponent(val) }, completion: { value in //If you do not call setNeedsStatusBarAppearanceUpdate() in an animation block, the animation variable won't be called it seems. UIView.animate(withDuration: 0.4, animations: { self.animating = true //Where you set the status for the bar (your part of the solution) self.statusBarStatus = false //Then you call for the refresh self.setNeedsStatusBarAppearanceUpdate() }) }) }