2015-09-27 50 views

回答

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

即使它在一个目标块中,我的动画并不会被激活。有任何想法吗? –

+0

它是否适用于“基于视图控制器的状态栏外观”=否? –

+0

没有测试,但是我猜这个按键是不行的 – Leo

13

夫特3

  • 个计算变量已经被更新移动到didSet斯威夫特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

我已经清理狮子座的惊人的答案有点句法)。

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的编码,这是解决方案:)(狮子座的目标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
  • SWIFT 3备选

嗨,发现绕了对斯威夫特3,使用了一个非常巧妙的方式一个私有变量与每个覆盖对配对。 我的原帖:https://stackoverflow.com/a/42083459/7183483

但这里是它的JIST:

这里有一个片段:

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

相关问题