2015-09-27 18 views

答えて

75

の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

マインズは、目標ブロック内にあってもアニメーション化されません。何か案は? –

+0

「コントローラベースのステータスバーの外観を表示」= NOですか? –

+0

テストしていませんが、このキーがNOの場合は動作しません。 – Leo

13

スウィフト3

preferredStatusBarUpdateAnimation

参照

  • 個の計算さ変数はスウィフト3didSetに更新を移動することで、私は少しレオの驚くべき答えをクリーンアップしている

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

  • アニメーション機能は、構文に更新したいくつかの機能を交換しました構文)。

    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時々...私はちょうど私の古いコーディング方法に慣れていますが、これはずっと良いsoooooooです:) – budidino

    2

    あなたは客観的Cでコーディングされている場合は、ここでは解決策は次のとおりです。)(レオのObjective Cのバージョン:Pのおかげで男!!!)

    、変数

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

    を宣言し、あなたがステータスバーに

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

    を非表示にしたいときには、この2つの方式を追加した後、このコードを追加します

    -(UIStatusBarAnimation) preferredStatusBarUpdateAnimation 
    { 
    return UIStatusBarAnimationFade; 
    } 
    
    -(BOOL) prefersStatusBarHidden 
    { return isHidden;} 
    
    は(笑)

    1
    • SWIFT 3 ALTERNATIVE

    やあみんなは、使用することにより、スウィフト3のためにそれについて行くのあまりすっきり方法を見つけたあなたの問題が解決することを願っていますそれぞれの上書きとのプライベートvarペアリング。 私のオリジナルのポスト:ここ

    抜粋です:

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

    私はそのようにように関数内で呼び出すことができます。ここhttps://stackoverflow.com/a/42083459/7183483

    しかし、それのJISTだ(これは私の例の一つでありますカスタム関数は無視されます)。

    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

    関連する問題