iOS版8增加了一个新的超级很酷的功能:隐藏的导航栏,当用户滚动。
这与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 var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
return .slide
}
}
某处更新barsHidden
代码和调用setNeedsStatusBarAppearanceUpdate()
这是在Xcode 6.1固定问题
navigationController?.navigationBar.hidden =真
我立足于this post一些意见,这是猜测这个答案。我不知道这是否会工作,因为苹果并没有给我们当导航栏隐藏任何直接的方式或委托方法。
子类UINavigationBar的导航栏作为。属性观测添加到其hidden
财产,像这样:
var hidden: Bool{
didSet{
UIApplication.sharedApplication().setStatusBarHidden(self.hidden, animation: .Slide)
}
}
你想,然后去你viewDidLoad
方法在您的主视图控制器,你的self.navigationBar
财产(或self.navigationController.navigationBar
,不知道哪一个)设定为新的导航栏的类的实例。
请注意,我现在不能测试此权利,让我知道如何/如果这个工程。
您可以通过使用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
}
好吧,我花了一整天这样做,希望这可以帮助一些人出来。有一个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
}