web-dev-qa-db-ja.com

スクロール中にステータスバーを非表示にする

iOS 8には、ユーザーがスクロールしているときにナビゲーションバーを非表示にするという非常に新しいクールな機能が追加されています。

これはviewDidloadに1行あります:

navigationController?.hidesBarsOnSwipe = true

かっこいいですね。

しかし、今私は少し問題があります:ナビゲーションバーが非表示になっているとき、ステータスバーはまだここにあり、コンテンツと重なっています。これは醜いです。

ナビゲーションバーが非表示になっているときに非表示にするにはどうすればよいですか?

19
jmcastel

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()を呼び出します

12
Yariv Nissim

これはXcode6.1の修正された問題です

navigationController?.navigationBar.hidden = true

1
Ali Raza

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   
}
0
Andrej

さて、私はこれを一日中過ごしました、うまくいけば、これは何人かの人々を助けるでしょう。 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
}
0
goodcow

私はこの答えを この投稿 に関するいくつかのコメントに基づいています。これは推測です。 Appleは、ナビゲーションバーが非表示になるときの直接的な方法やデリゲートメソッドを提供しないため、これが機能するかどうかはわかりません。

UINavigationBarをNavigationBarとしてサブクラス化します。次のように、プロパティオブザーバーをそのhiddenプロパティに追加します。

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

次に、メインビューコントローラーのviewDidLoadメソッドに移動し、self.navigationBarプロパティ(またはself.navigationController.navigationBar、どちらかわからない)を新しいNavigationBarクラスのインスタンスに設定します。 。

現在、これをテストすることはできません。これがどのように機能するか、または機能するかどうかをお知らせください。

0
erdekhayser