2015-09-27 17 views

Odpowiedz

75

Patrz preferredStatusBarUpdateAnimation,

GIF

enter image description here

kod

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 
    } 
} 
+0

Moja animacja nie działa, mimo że znajduje się w bloku celu. Jakieś pomysły? –

+0

Czy działa z opcją "Wyświetlanie paska stanu na podstawie kontrolera" = NIE? –

+0

Nie testowałem, ale domyślam się, że nie działa, gdy ten klucz jest NIE – Leo

13

Swift 3

  • Obliczone zmienne zastąpić niektóre funkcje
  • Funkcja ożywiony został Zaktualizowana składnia

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 
    } 
} 
9

mam wyczyszczone się zdumiewającą odpowiedź Leo nieco przesuwając aktualizację do didSet (Swift 3 składnia).

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 
    } 
} 
+0

Chciałbym pamiętać, aby użyć programu didSet od czasu do czasu ... Jestem przyzwyczajony do moich starych sposobów kodowania, ale to jest o wiele lepsze :) – budidino

2

jeśli kodowanie z Objective C, oto rozwiązanie:) (cel wersji Leo C: P Dzięki stary !!!)

zadeklarować zmienną

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

a następnie dodać ten kod, jeśli chcesz, aby ukryć pasek stanu

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

potem dodać dwie metody

-(UIStatusBarAnimation) preferredStatusBarUpdateAnimation 
{ 
return UIStatusBarAnimationFade; 
} 

-(BOOL) prefersStatusBarHidden 
{ return isHidden;} 

Nadzieję problem będzie rozwiązać (uśmiech)

1
  • SWIFT 3 ALTERNATYWNE

Hey guys, znaleźli wiele schludniejszy sposób będzie o tym Swift 3, stosując prywatne parowanie var z każdym z przesłonięć. mój oryginalny post: https://stackoverflow.com/a/42083459/7183483

ale tu jist niego:

Oto fragment:

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

które następnie mógłby zadzwonić w funkcję tak: (to jest jeden z moich przykładów , więc zignoruj ​​funkcję niestandardową).

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

To jest świetne rozwiązanie. Nie myślałem o tym, aby zmienić status flagi ukrytej na dynamiczny. – phatmann

Powiązane problemy