LoginSignup
13
10

More than 5 years have passed since last update.

iOS11ライクなUINavigationBarを実装する

Last updated at Posted at 2017-12-22

iOS11がリリースされて久しいですが、iOS11では標準アプリのデザインがiOS10で変わったミュージックアプリのようにナビゲーションバーのタイトルの位置が変り、フォントサイズも大きくなりました。

また、iOS11ではサーチバーもナビゲーションバーに統合されたデザインとなっています。

今回はこれらの実装方法について書こうと思います。

まず、ナビゲーションバーのタイトルから。
iOS11の標準アプリのナビゲーションバーはほとんど全部上のスクリーンショットのように左寄りの大きなフォントになっていますが、アプリを実装する際、デフォルトでは従来の中央に表示されるデザインになります。
これをiOS11ライクにするにはStoryboard、コードのどちらでも可能です。
Storyboardで設定する場合、インスペクタでNavigation Barの「Prefers Large Titles」にチェックを入れれば完了です。

スクリーンショット 2017-11-26 1.29.58.png

チェックを入れるとそのNavigationControllerに紐づくViewControllerのタイトルが自動で切り替わります。
コードで実装したい場合は以下の1行を書いてあげれば完了です。

navigationController?.navigationBar.prefersLargeTitles = true

これでStoryboardで設定したい場合と同様、NavigationControllerに紐づくViewControllerのタイトルが自動で切り替わります。
全部大きなタイトルでいい場合はこれでOKなのですが、画面によってタイトルの表示を変えたい場合は UINavigationItem#largeTitleDisplayMode を設定することで実現できます。
これはStoryboard上では設定できない(RootとなっているViewController以外はNavigationItemのインスペクタが表示されないから)のでコードで実装する必要があります。
largeTitleDisplayMode には以下の3つが設定できます。

case description
automatic 前の画面の表示を継承する
always 常に大きいタイトルで表示する
never 大きなタイトルにはならない

MainViewControllerからDetailViewControllerへ遷移する場合、
ViewDidLoadでそれぞれ navigationItem.largeTitleDisplayMode.always.never を設定してあげればOKです。
※以下ではないので注意!この書き方だと largeTitleDisplayMode は反映されません。

navigationController?.navigationItem.largeTitleDisplayMode = .never

次にサーチバーです。
これも簡単で、UISearchControllerUINavigationItem#searchControllerにセットするだけです。

let searchController = UISearchController(searchResultsController: nil)
navigationItem.searchController = searchController

注意すべき点は、UINavigationItem#searchController は画面表示時は隠れていて画面を下に引っ張ることで出てきます。
なので検索が重要な画面では

navigationItem.hidesSearchBarWhenScrolling = false

と設定して、サーチバーが常に表示された状態にしておくのが良いでしょう。
hidesSearchBarWhenScrolling はスクロールされたときにサーチバーを隠すかどうかのフラグです。
false にするとサーチバーが常に表示されます。
標準アプリだと、設定が引っ張って出すUIで、連絡先は常に表示されたUIになっていたりします。
 

サーチバーが画面表示時には出ているが、画面をスクロールすると消えるという実装は標準では用意されていないようです。
常に表示されていると画面の領域が狭くなるのでそれが許容できない場合は UINavigationItem#searchController を使うのをやめたほうが良さそう。

ちなみにテーブルビューにサーチバーとRefreshControlがあるUIは一般的だと思いますが、RefreshControlを有効にしている場合、大きくタイトルを表示している場合と従来の中央にタイトルを表示している場合でインジケータの表示が異なります。
 
ただし、これらはOSが勝手にやってることなので、実装時は何も気にすることなく普通にRefreshControlを実装すればOKです。

以上、iOS11ライクなUINavigationBarの実装Tipsでした。

13
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
10