2015年12月29日火曜日

NavigationBar が View に重なる対応について

今更ながらのところでもあるけど、UINavigationController を使用している場合に、storyboard 上で、NavigationBar が View に重なる対応についてどうすれば良いかを考えて見ることにする。

この内容は iOS7 から View がフル画面表示に変わった時から発生した内容なので、なぜ今頃という面があるかもしれないが、今一歩良い対応方法が見つからないので、調べてみることにした。

ちなみに、今までは、先にビューのデザインをして、オブジェクトを配置後に、座標0, 0 の位置にずらす方法で対応していた。
よって、最終的にはナビゲーションバーの下にオブジェクトが配置される様になる。
この方法で、実行時には問題なく表示されるのだが、問題点はメンテナンスを行う際に、ナビゲーションバーの下のオブジェクトを見逃す場合があると言うこと。
(そんなバカなと思うかもしれないが、焦って対応をする場合などは案外見落としがちになる)
その他、あえてナビゲーションバー分下にビューをずらす方法も考えたが、Autolayout の制約が難しくなるので却下した。

この問題に対応すべく storyboard を使用した場合の良い方法を調べてみることにした。
調べてみると、みんなどうやってこの部分を対応しているかよく分からない。
この内容でよく引用されているのが以下の記事。
やはりお前らのiOS7対応は間違っている(解説編)
http://qiita.com/yimajo/items/254c7cebab7864678246
上記や、その他のサイトを見る限り以下の方法がある。
  1. ViewController の Extend Edges の Under Top Bars と、Under Bottom Bars のチェックを外す
  2. 上としっしょだが、コードで指定する
    self.edgesForExtendedLayout = UIRectEdgeNone;
  3. NavigationController の Navigation Bar の Translucent のチェックを外す
いずれも、ビュー開始位置がナビゲーションバーの下からになる。
(すりガラス的な効果が消えたふうに見える)
その他、各 ViewController の Extend Edges の Under Top Bars のチェック、
同じく、ViewController の Adjust Scroll View Insets のチェックを外すなどもある。

うーん。
調べてみた結果自分の困っている内容(Xcode での視界性の悪さ)とは別の内容(アプリの仕様というか不具合対応)での回答が多いようだ。

ここいら辺を踏まえて、自分の問題に対するベターと思われる方法を考えてみた。
方法は、上記のいずれのチェックも外さずに、NavigationController の Attributes にある Shows Navigation Bar のチェックを外し、コード上でこの属性を有効にする方法。
これであれば、Storyboard からは、ナビゲーションバーの表示が消えて、作業・確認しやすくなる。
制約等も直感的に付けることが出来る。
この場合は、ナビゲーションバー先頭の ViewController の viewDidLoad で
[[self navigationController] setNavigationBarHidden:NO animated:YES];
// Swift
self.navigationController?.setNavigationBarHidden(false, animated: true)
とするか、サブクラスを作成して、上記のコードで指定するなどが必要。
難点は、画面上からナビゲーションバーが消えてしまうので、ナビゲーションバーが存在しないかと思ってしまう点か。
(storyborad に UINavigationController が出ているから大丈夫とは思うが)
あくまで、ベターなのでベストがわからない。。。

しかし、なぜこんなに苦労が必要なのだろうか?
storyboard で見えたとおりに表示されないという Xcode 側に問題がある気がするのだが(ナビゲーションバーとフル画面を表示したいなら storyboard でナビゲーションバー部分を別表現すればいいのに)、Xcode 作っている開発者は違和感覚えないのだろうか?
Written with StackEdit.

0 件のコメント:

コメントを投稿