隐藏状态栏滚动时

问题描述 投票:19回答:5

iOS版8增加了一个新的超级很酷的功能:隐藏的导航栏,当用户滚动。

这与viewDidload一行:

navigationController?.hidesBarsOnSwipe = true

酷,不是吗?

但现在我有一个小问题:当导航栏被隐藏,状态栏还在这里和重复的内容,这是丑陋的。

我应该怎么做才能让它时隐时现的导航栏被隐藏?

ios swift ios8 statusbar
5个回答
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
投票

这是在Xcode 6.1固定问题

navigationController?.navigationBar.hidden =真


0
投票

我立足于this post一些意见,这是猜测这个答案。我不知道这是否会工作,因为苹果并没有给我们当导航栏隐藏任何直接的方式或委托方法。

子类UINavigationBar的导航栏作为。属性观测添加到其hidden财产,像这样:

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

你想,然后去你viewDidLoad方法在您的主视图控制器,你的self.navigationBar财产(或self.navigationController.navigationBar,不知道哪一个)设定为新的导航栏的类的实例。

请注意,我现在不能测试此权利,让我知道如何/如果这个工程。


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   
}

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
}
© www.soinside.com 2019 - 2024. All rights reserved.