setStatusBarHidden (: withAnimation:) déprécié en iOS 9

est maintenant obsolète et la documentation dit d'utiliser [UIViewController prefersStatusBarHidden] mais quelle est l'alternative dans iOS 9 Si je veux toujours cacher la barre d'état avec une animation de diapositive?

35
demandé sur jacobsieradzki 2015-09-27 16:47:54

5 réponses

reportez-vous à preferredStatusBarUpdateAnimation,

Gif

enter image description here

Code

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
    }
 }
86
répondu Leo 2017-08-10 02:04:01

Swift 3

  • les variables Calculées ont remplacé certaines fonctions
  • La fonction animate a mis à jour la syntaxe

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
    }
}
14
répondu Tim Windsor Brown 2017-01-28 22:28:12

j'ai nettoyé Leo est incroyable réponse un peu en déplaçant la mise à jour didSet ( Swift 3 syntaxe).

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
    }
}
10
répondu Alex Staravoitau 2016-09-27 22:13:11

si vous codez avec l'objectif c, Voici la solution :) (version Objectif C de Leo: P thanks man!!!)

déclarer une variable

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

et puis ajouter ce code quand vous voulez cacher la barre d'état

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

après que ajouter ces deux méthode

-(UIStatusBarAnimation) preferredStatusBarUpdateAnimation
{
return UIStatusBarAnimationFade;
}

-(BOOL) prefersStatusBarHidden
{ return isHidden;}

j'Espère que votre problème sera de résoudre (sourire)

2
répondu zahid hasan 2016-10-12 22:10:40
  • SWIFT 3 ALTERNATIVE

Hey les gars, j'ai trouvé une façon beaucoup plus claire d'y aller pour Swift 3, en utilisant un appariement var privé avec chacune des dérogations. Mon post original: https://stackoverflow.com/a/42083459/7183483

mais voici le jist de:

Voici un morceau de code:

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

que je pourrais alors appeler dans une fonction comme celle-ci: (c'est un de mes exemples, alors ignorez la coutume fonction.)

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()
        })
    })
}
1
répondu murphguy 2017-05-23 11:47:08