滚动时隐藏状态栏

时间:2014-10-04 21:16:15

标签: ios swift ios8 statusbar

iOS 8增加了一个超酷的新功能:在用户滚动时隐藏导航栏。

这在viewDidload中有一行:

navigationController?.hidesBarsOnSwipe = true

很酷,不是吗?

但是现在我遇到了一个小问题:当导航栏被隐藏时,状态栏仍然在这里并重叠内容,这很难看。

隐藏导航栏时,我该怎么做才能隐藏它?

5 个答案:

答案 0 :(得分:12)

在UIViewController上覆盖以下方法:

extension MyViewController {
  override func prefersStatusBarHidden() -> Bool {
    return barsHidden // this is a custom property
  }

  // Override only if you want a different animation than the default
  override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
    return .slide
  }
}

在代码中的某处更新barsHidden并致电 setNeedsStatusBarAppearanceUpdate()

答案 1 :(得分:1)

这是Xcode 6.1中修复的问题

  

navigationController?.navigationBar.hidden = true

答案 2 :(得分:0)

我的回答基于对this post的一些评论,这是一种猜测。我不确定这是否有效,因为Apple在导航栏隐藏时没有给我们任何直接的方法或委托方法。

将UINavigationBar子类化为NavigationBar。将属性观察者添加到其hidden属性中,如下所示:

var hidden: Bool{
didSet{
    UIApplication.sharedApplication().setStatusBarHidden(self.hidden, animation: .Slide)
}
}

然后,您希望转到主视图控制器中的viewDidLoad方法,并将self.navigationBar属性(或self.navigationController.navigationBar,不确定哪一个)设置为新实例NavigationBar类。

请注意,我现在无法测试,请告诉我/如果这样做。

答案 3 :(得分:0)

您可以使用UISwipeGestureRecognizer检测滑动。我在UIWebView上使用它:

在viewDidLoad中我有:

let swipeUp = UISwipeGestureRecognizer(target: self, action: "didSwipe")
let swipeDown = UISwipeGestureRecognizer(target: self, action: "didSwipe")
swipeUp.direction = UISwipeGestureRecognizerDirection.Up
swipeDown.direction = UISwipeGestureRecognizerDirection.Down
webView.addGestureRecognizer(swipeUp)
webView.addGestureRecognizer(swipeDown)
navigationController?.hidesBarsOnSwipe = true

我的viewcontroller也有一个扩展名,名为WebViewViewController:

extension WebViewViewController {
    override func prefersStatusBarHidden() -> Bool {
        return hideStatusBar
    }

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

在我的WebViewViewController的类级别上,我也有:

var hideStatusBar = false

func didSwipe() {
    hideStatusBar = true   
}

答案 4 :(得分:0)

好吧,我花了一整天的时间来做这件事,希望这可以帮助一些人。有一个barHideOnSwipeGestureRecognizer。所以你可以为相应的UIPanGesture创建一个监听器,注意如果导航栏被隐藏,那么它的y原点是-44.0;否则,它是0(不是20,因为我们隐藏了状态栏!)。

在视图控制器中:

 // Declare at beginning
var curFramePosition: Double!
var showStatusBar: Bool = true
self.navigationController?.barHideOnSwipeGestureRecognizer.addTarget(self, action: "didSwipe:")

...

override func viewDidLoad(){
    self.navigationController?.hidesBarsOnSwipe = true
  curFramePosition = 0.0 // Not hidden
  self.navigationController?.barHideOnSwipeGestureRecognizer.addTarget(self, action: "didSwipe:")
  ...
}

func didSwipe(swipe: UIPanGestureRecognizer){
    // Visible to hidden
    if curFramePosition == 0 && self.navigationController?.navigationBar.frame.origin.y == -44 {
        curFramePosition = -44
        showStatusBar = false
        prefersStatusBarHidden()
        setNeedsStatusBarAppearanceUpdate()
    }
    // Hidden to visible
    else if curFramePosition == -44 && self.navigationController?.navigationBar.frame.origin.y == 0 {
        curFramePosition = 0
        showStatusBar = true
        prefersStatusBarHidden()
        setNeedsStatusBarAppearanceUpdate()
    }
}

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