iOS 8には、ユーザーがスクロールしているときにナビゲーションバーを非表示にするという非常に新しいクールな機能が追加されています。
これはviewDidload
に1行あります:
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()
を呼び出します
これはXcode6.1の修正された問題です
navigationController?.navigationBar.hidden = true
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と呼ばれるviewcontrollerの拡張機能もあります。
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
}
私はこの答えを この投稿 に関するいくつかのコメントに基づいています。これは推測です。 Appleは、ナビゲーションバーが非表示になるときの直接的な方法やデリゲートメソッドを提供しないため、これが機能するかどうかはわかりません。
UINavigationBarをNavigationBarとしてサブクラス化します。次のように、プロパティオブザーバーをそのhidden
プロパティに追加します。
var hidden: Bool{
didSet{
UIApplication.sharedApplication().setStatusBarHidden(self.hidden, animation: .Slide)
}
}
次に、メインビューコントローラーのviewDidLoad
メソッドに移動し、self.navigationBar
プロパティ(またはself.navigationController.navigationBar
、どちらかわからない)を新しいNavigationBarクラスのインスタンスに設定します。 。
現在、これをテストすることはできません。これがどのように機能するか、または機能するかどうかをお知らせください。