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