滚动时隐藏状态栏
iOS 8增加了一个超酷的新function:当用户滚动时隐藏导航栏。
这在viewDidload
中有viewDidload
:
navigationController?.hidesBarsOnSwipe = true
很酷,不是吗?
但现在我有一个小问题:当导航栏被隐藏时,状态栏仍然在这里,重叠的内容,这是丑陋的。
隐藏导航栏时,应该如何隐藏它?
覆盖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 func preferredStatusBarUpdateAnimation() -> UIStatusBarAnimation { return .Slide } }
更新barsHidden
在代码的某处,并调用setNeedsStatusBarAppearanceUpdate()
这是Xcode 6.1中的问题
navigationController?.navigationBar.hidden = true
我是根据这个post的一些评论的基础上这个答案,这是猜测。 我不知道这是否会起作用,因为苹果公司并没有给我们任何直接的方式或导航栏隐藏的委托方法。
导航条的子类UINavigationBar。 添加一个属性观察者到它的hidden
属性,如下所示:
var hidden: Bool{ didSet{ UIApplication.sharedApplication().setStatusBarHidden(self.hidden, animation: .Slide) } }
然后,您想要在您的主视图控制器中使用viewDidLoad
方法,并将self.navigationBar
属性(或self.navigationController.navigationBar
,不确定是哪一个)设置为新的NavigationBar类的实例。
请注意,我现在不能testing这个,请告诉我/如果这个工作。
您可以使用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
我也有一个扩展到我的视图控制器,称为WebViewViewController:
extension WebViewViewController { override func prefersStatusBarHidden() -> Bool { return hideStatusBar } override func preferredStatusBarUpdateAnimation() -> UIStatusBarAnimation { return UIStatusBarAnimation.Slide } }
在我的WebViewViewController的类级别中,我也有:
var hideStatusBar = false func didSwipe() { hideStatusBar = true }
好吧,我整天都在这样做,希望这可以帮助一些人。 有一个barHideOnSwipeGestureRecognizer
。 所以你可以为相应的UIPanGesture
创build一个监听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 }