setStatusBarHidden (_: withAnimation :) desaprobado en iOS 9

Veo que en iOS 9 setStatusBarHidden(_:withAnimation:) ahora está en desuso y la documentation dice que usar [UIViewController prefersStatusBarHidden] lugar, pero ¿cuál es la alternativa en iOS 9 si todavía quiero ocultar la barra de estado con una animation de diapositiva?

Remítase a prefernetworkingStatusBarUpdateAnimation ,

Gif

introduzca la descripción de la imagen aquí

Código

 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 prefernetworkingStatusBarUpdateAnimation: UIStatusBarAnimation{ return .slide } override var prefersStatusBarHidden: Bool{ return isHidden } } 

Swift 3

  • Las variables computadas han reemplazado algunas funciones
  • La function animada ha actualizado la syntax

 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 prefernetworkingStatusBarUpdateAnimation: UIStatusBarAnimation { return UIStatusBarAnimation.slide } override var prefersStatusBarHidden: Bool { return isHidden } } 

He limpiado la sorprendente respuesta de Leo moviendo la actualización a didSet (syntax Swift 3 ).

 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 prefernetworkingStatusBarUpdateAnimation: UIStatusBarAnimation { return .slide } } 

si está codificando con el objective c, aquí está la solución:) (La versión de Objective C de Leo: P ¡gracias!)

declarar una variable

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

y luego agrega este código cuando quieras ocultar la barra de estado

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

después de eso, agrega este método

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

Espero que tu problema sea resolver (sonrisa)

  • SWIFT 3 ALTERNATIVA

Hola muchachos, encontré una manera mucho más orderada de hacerlo para Swift 3, usando un emparejamiento de var privado con cada anulación. Mi publicación original: https://stackoverflow.com/a/42083459/7183483

pero aquí está lo esencial:

Aquí hay un fragment:

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

que entonces podría llamar en una function como tal: (este es uno de mis ejemplos, así que ignore la function personalizada).

 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() }) }) }