[iOS 8] ナビゲーションバーとツールバーを同時消し

hidesBarsOnTap

iOS 8 から、ナビゲーションバーとツールバーを同時に消去できるメソッドが UINavigationController に追加されました。

  • hidesBarsOnSwipe
  • hidesBarsOnTap
  • hidesBarsWhenKeyboardAppears
  • hidesBarsWhenVerticallyCompact

今回は hidesBarsOnTap について説明します。

hidesBarsOnTap は値が true の場合、navigationController の view がタップされるたびに、ナビゲーションバーとツールバーの表示/非表示を切り替えます。
複雑な実装をすることなく、iPhone 標準の「写真」アプリのような表示切り替えが可能となります。

サンプルコード

override func viewDidLoad() {
    super.viewDidLoad()
    navigationController?.hidesBarsOnTap = true  // これだけ
}

また、Storyboard で設定することも可能です。

hidesBarsOnTap

なお、ステータスバーの表示/非表示をナビゲーションバーと連動させたいときは、以下のメソッドを ViewController でオーバーライドします。

override func prefersStatusBarHidden() -> Bool {
    return navigationController!.navigationBarHidden
}

ただし、どういうわけかこのメソッドを実装すると、ナビゲーションバーが非表示になる時のアニメーションがなくなってしまいます。(Slide ではなく None という感じ)

まとめ

なかなか便利なメソッドですが、動きを細かくコントロールできなかったり、挙動が怪しい部分があるので、実戦で使うにはまだ難しいかなと個人的には思いました。
具体的には以下の様な懸念事項が挙げられます。

  • view にボタンなどを配置した場合、そのボタンがタップされても表示/非表示を切り替えてしまう
  • ステータスバーとナビゲーションバー連動時のアニメーションが不満(上で書いたやつです)
  • ツールバーにアイテムがない場合、タップした時にツールバーが非表示にならない

しかし、「こんなメソッドがある」というのは覚えておいて損はないと思います。
これから徐々に挙動や機能が進化することを願っています。