2012年8月14日火曜日

iOSでの画面遷移メモ

ViewController(前提知識)

iOSではMVCアーキテクチャでいうViewとControllerを一体化させた、その名もViewControllerが、ユーザーインターフェースのキーになっている。

ビューを管理するViewController(コンテンツViewController)

Viewは自身をサブビューにする(Compositeパターン)ことで階層化されており、ViewControllerはその階層化されたViewの、ルートを保持することで、階層化されたView全体を管理する。

具体的に言えば、viewdidload、viewdidunloadなどのコールバックメソッドに応じて、ビューの表示・解放を行うことで、iOSのタイトなリソースをフル活用して、リッチなインターフェースを実現させている。

UIViewControllerを継承して自作するカスタムViewControllerと、表形式でデータを表示することに特化したTableViewControllerがここに入る…のだが、iOS5で事情が変わっている(後述)。

複数のViewControllerを管理するViewController(コンテナViewController)

コンテナViewControllerは、複数のViewControllerを保持して、それらを切り替える。

ViewControllerを階層的に表示するNavigationControllerは、親子となるViewControllerの表示の切り替えを管理し、その表示履歴をスタックで保持することで、複数のレベルに分かれた画面構成を提供する。

TabBarControllerは、「階層構造を持つNavigationController」とは対極的に、独立・並列した複数のViewControllerの切り替えを、タブの操作によって提供する。

PageViewControllerは、NavigationControllerとTabBarControllerやその他画面遷移を理念どおりに使用すると、電子書籍アプリすらまともに作るのも大変という悲しい現実を前に、組み込みで追加されたページ切り替え専用のViewControllerである。

iPadで追加されたいくつかのViewController

SplitViewControllerは画面を二つに分割して、マスタと詳細を表示することでiPadの広い画面を有効活用する…という名目のビューだが、自動的に縦横画面に対応してくれるのはいいものの、制約がひどく使い勝手はよろしくない。

PopoverControllerは他のコンテンツViewControllerの表示を、ポップアップで行うことができる。基本的には、iPadではアクションシートやモーダルによる全画面トランジションは使い勝手が悪いので、その代替として利用するもの。

iOSでできる基本の画面遷移

・NavigationControllerによる階層的な画面遷移

上部にナビゲーションバーが表示され、上位階層に戻るためのボタンが提供される。何も考えなくとも階層的なアプリケーションを作れる。

・TabBarControllerによる並列的な画面遷移

タブバーが表示される。モノトーンの素材を用意するだけでオサレなタブを表示できる反面、タブの外観のカスタマイズは面倒かつ、ダーティな手法が必要。

・モーダルビューによる遷移

「現在の表示に対して割り込みを行い、ユーザーの応答を受け取る」ためにモーダルモードとして別のViewControllerの内容を表示する。本来は応答待ちのための、一時的な割り込みの遷移として存在しているが、それを守らなければもっとも単純に画面遷移を行える。

※あと内臓辞書で単語の意味を調べて表示するUIReferenceLibraryViewControllerとかもある。

iOS5で追加されたセグエの概念

storyboardという時点で、初心者を除いてどうでもいい感じのセグエは、ソースとディスティネーション二つのコンテナViewControllerを関連付けて、それぞれのViewControllerの生成と解放、そして画面遷移のアニメーションを行う。

pushセグエ、modalセグエ、reration ship、カスタムセグエがあり、pushはNavigationController、modalはモーダルビュー、reration ship(正しくはセグエではない)はTabControllerの遷移に名前をつけたもの。

ViewControllerの存在を隠蔽して画面遷移を表に出しているが、「階層ナビゲーション」「タブによる並列表示」「モーダルによる応答処理」の3つが基本であることは変わらない。

カスタムセグエは、UIStoryboaredSegueのサブクラスをカスタムすることで、独自の画面遷移を作れる。サンプルコードを見る限り、実際の画面遷移自体は、モーダルビューの遷移を使っているので、カスタムセグエのコードを書けるレベルならモーダルビューで切り替えるだけだと思う…。

iOS5で追加された自作コンテナViewController

iOSの画面遷移は「階層ナビゲーション」「タブによる並列表示」「モーダルによる応答処理」の3つに関して言えば、少ない労力で高品質なインターフェースを構築できる。

しかし「画面の一部だけを切り替えたい」となるとSplitViewControllerの面倒な制約は邪魔になることが多く、「階層でも独立でもないナビゲーションをしたい」となると、モーダルやaddSubviewの切り替えをそれらしく見せるしかなかった。

が、iOS5ではUIViewControllerが、UIViewController自身を子を持てる(コンテナとして振舞える)階層構造に変化した。

addChildViewControllerで子UIViewControllerを登録すると、viewDidLoadなどのコールバックメソッドが子に伝播するようになる。またchildViewController同士の画面をトランジション付きで切り替えることなどができる。

ページ遷移を行うPageViewControllerは、カスタムコンテナUIViewControllerの実装例に過ぎないと思う。

まとめ
  • iOSの画面遷移の基本は「階層ナビゲーション」「タブによる並列表示」「モーダルによる応答処理」の三つである。
  • ストーリーボードはかっこよく言い換えて煙に巻いているが、基本は変わらない。
  • ただそれとは別にカスタムコンテナUIViewControllerの作成が可能になり、画面遷移の自由度は大幅に増した。
  • iOS5で進化した自由な画面遷移の例として、PageViewControllerがある。

0 件のコメント:

コメントを投稿