2015-09-27 3 views
31

Я вижу, что в iOS 9 setStatusBarHidden(_:withAnimation:) теперь устарели, и в документации говорится, что вместо этого используется [UIViewController prefersStatusBarHidden], но какая альтернатива в iOS 9, если я все еще хочу скрыть строку состояния с помощью анимация слайдов?setStatusBarHidden (_: withAnimation :) устарел в iOS 9

ответ

75

См preferredStatusBarUpdateAnimation,

GiF

enter image description here

код

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

Mine не оживляет, даже если он находится в прицельном блоке. Есть идеи? –

+0

Работает ли она с «Просмотр состояния панели на основе контроллера» = НЕТ? –

+0

Не тестировали, но я думаю, что не работает, когда эта клавиша NO: – Leo

13

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

Я очистил вверх удивительный ответ Лео немного, перемещая обновление didSet (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 preferredStatusBarUpdateAnimation: UIStatusBarAnimation { 
     return .slide 
    } 
} 
+0

Хотелось бы, чтобы я не забыл использовать didSet время от времени ... Я просто привык к своим старым способам кодирования, но это намного лучше :). – budidino

2

если вы кодирования с Objective C, вот решение:) (Лео Objective версия C: P спасибо мужчина !!!)

объявить переменную

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

Надежда ваша проблема будет решить (улыбка)

1
  • СВИФТ 3 АЛЬТЕРНАТИВА

Эй, ребята, нашли много аккуратнее способ идти об этом Swift 3, используя частное var-сопряжение с каждым из переопределений. Мой оригинальный пост: 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() 
     }) 
    }) 
} 
+0

Это отличное решение. Я не думал о том, чтобы сделать статус скрытым флагом динамическим. – phatmann

Смежные вопросы