2016-05-28 6 views
2

Ich habe AuthViewController ignoriert, die MainViewController wie so präsentiert:preferredStatusBarUpdateAnimation wird

let mainVC = MainViewContoller() 
mainVC.modalTransitionStyle = .CrossDissolve 
authVC.presentViewController(mainVC, animated: true, completion: nil) 

Ich möchte die AuthViewController auf die Statusleiste auszublenden, aber die MainViewController zu zeigen, wie so:

AuthViewController { 

    override func preferredStatusBarStyle() -> UIStatusBarStyle { 
     return .LightContent 
    } 

    override func preferredStatusBarUpdateAnimation() -> UIStatusBarAnimation { 
     return .Fade 
    } 

    override func prefersStatusBarHidden() -> Bool { 
     return false 
    } 
} 

MainViewController { 

    override func preferredStatusBarStyle() -> UIStatusBarStyle { 
     return .LightContent 
    } 

    override func preferredStatusBarUpdateAnimation() -> UIStatusBarAnimation { 
     return .Fade 
    } 

    override func prefersStatusBarHidden() -> Bool { 
     return false 
    } 
} 

Die Die Statusleiste wird angezeigt, die preferredStatusBarUpdateAnimation() Überschreibung wird jedoch ignoriert. Die Statusleiste wird ohne Animation angezeigt.

habe ich nur in der Lage gewesen, es durch das Setzen prefersStatusBarHidden auf MainViewController zu true bis zum viewDidAppear zu animieren zu bekommen, dann ist dieser Aufruf:

UIView.animateWithDuration(0.3) { 
    self.setNeedsStatusBarAppearanceUpdate() 
} 

Ich möchte dies nicht jedes Mal habe zu rufen. Was mache ich falsch?

Antwort

2

suchte auch nach einer Lösung für diese. Es scheint jedoch, dass Sie bereits die halbe Lösung haben. Sie müssen die Überschreibungen für die Variablen einrichten, aber die beste Vorgehensweise für mich bestand darin, ein privates Variablenpaar für jede der Überschreibungen zu erstellen, und jede Überschreibung gibt ihre jeweilige private Variable zurück (siehe unten). Sie würden dann die privaten Variablen ändern und setNeedsStatusBarAppearanceUpdate aufrufen.

Außerdem müssen Sie View controller-based status bar appearance in Ihrem zu YES setzen. Andernfalls wird es immer noch auf die alten UIApplication.shared... Methoden zurückgreifen.

Hier ist ein Ausschnitt:

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

, die ich dann in einer Funktion aufrufen könnte etwa so: (dies ist eine meiner Beispiele, so ignorieren die benutzerdefinierte Funktion).

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

Sie am Ende zum Abstimmen Controller jede Ansicht zu haben, aber es scheint, wie es ist, was Sie tun wollen, so hoffe, es hilft!

Verwandte Themen