UISplitViewController 公式ドキュメントの和訳(iOS14 対応)


iOS14 になって Split View の UI が大きく変わり、真剣に理解するために和訳をしてみました。

原文:UISplitViewController | Apple Developer Documentation


UISplitViewController

階層的なインタフェースのコンテナビューコントローラ。

宣言(Declaration)

class UISplitViewController : UIViewController

概要(Overview)

Split view controller は階層的なインタフェースのためのビューコントローラで、その子のビューコントローラを管理するコンテナビューコントローラです。この種類のインタフェースにおいては、1つのビューコントローラでの変化が、他のコンテンツに影響を与えます。

Split view インタフェースは、コンテンツをフィルタリングしたり、階層構造のコンテンツをナビゲートするのにもっとも適しています。例えば Notes(メモ)アプリの場合、primary sidebar でフォルダを選択し、その中のノート一覧から1つを選択すると、secondary view に選択されたノートが表示されます。

通常、split view controller は、アプリの window の root view controller とします。Split view controller それ自身は特別な見た目は持ちません。ほとんどの見た目は子ビューコントローラによって決まります。

navigation スタックに split view controller をプッシュすることはできません。また、split view controller を子として、他のコンテナビューコントローラに入れることができますが、ほとんどの場合おすすめしません。デザインについては、iOS Human Interface Guidelinesをご覧ください。

Split View スタイル(Split View Styles)

iOS14 以降では、UISplitViewController は「カラムスタイルレイアウト」をサポートします。カラムスタイルの split view controller では、init(style:) でインスタンスする際に、2カラムもしくは3カラムのインタフェースを指定できます。

  • UISplitViewController.Style.doubleColumn を指定すると、2カラムのレイアウトを構築できます。このスタイルの split view controller は、primary と secondary の2つの子ビューコントローラを配置し、管理します。
  • UISplitViewController.Style.tripleColumn を指定することで、3カラムのレイアウトを構築できます。このスタイルの split view controller は、primary、supplementary、secondary の3つの子 view controller を配置し、管理します。

iOS14 より前のバージョンでは、UISplitViewController は、primary view controller と secondary view controller を持つ split view インタフェーススタイルのみをサポートします。この以前のスタイルは init(style:) 以外の方法でインスタンスされた場合に適用されます。この場合、UISplitViewController.Style.unspecified を持ち、iOS14 以降に導入されたカラムスタイルの API には応答しません。

子ビューコントローラ(Child View Controllers)

カラムスタイルの split view インタフェースにおいては、それぞれのビューコントローラを登録、取得するのに setViewController(_:for:)viewController(for:) を使います。Split view controller は全ての子ビューコントローラをナビゲーションコントローラの中にラップします。もしナビゲーションコントローラではない子ビューコントローラを登録した時、split view controller はナビゲーションコントローラを生成します。Split view controller は viewController(for:) を通じて元のビューコントローラを返しますが、children プロパティは、元のビューコントローラをラップするナビゲーションコントローラを含みます。ビューコントローラを各カラムに指定することで、show(_:)hide(_:) を使って表示したり、非表示にすることができます。

以前の split view インタフェースにおいては、Interface Builder を使うか、viewControllers プロパティにビューコントローラをセットすることで、子ビューコントローラを設定できます。primary もしくは secondary ビューコントローラを変更する必要がある場合、show(_:sender:)showDetailViewController(_:sender:) を使って行うことが推奨されます。(ビューコントローラのプロパティを直接変更する代わりに)これらのメソッドを使うことで、現在の表示モードやサイズクラスに最適な方法で、指定のビューコントローラを表示します。

画面遷移(Interface Transitions)

Split view controller は、そのインタフェース内で起きた変化に応じて、ビューを折り畳んだり広げたりします。例えば、サイズクラスが holizontally regular から horizontally compact に切り替わった時に発生したり、ユーザの操作やプログラムによってカラムを表示/非表示する場合に発生します。Split view controller はその delegate オブジェクトとともに、この動作を行います。このデリゲートは UISplitViewControllerDelegate プロトコルに適合したオブジェクトです。

カラムスタイルの split view インタフェースにおいて、折り畳まれた状態の時、primary、supplementary、secondary ではない異なるビューコントローラを表示することができます。setViewController(_:for:) を使って望みのビューコントローラを UISplitViewController.Column.compact カラムに設定してください。もし折り畳む遷移や、広げる遷移をよりカスタマイズしたい場合は、Column-Style Split Views を参照してください。

以前の split view インタフェースの画面遷移についてのは、Classic Split Views を参照してください。

表示モード(Display Mode)

Split view controller の現在の表示モードは、子ビューコントローラの見た目の組み合わせによって表されます。それにより、いくつの子ビューコントローラが表示されるか、どのように相互に連携して配置されるかが決まります。例えば、子ビューコントローラを横並びで表示させたり、1つだけ表示せたり、部分的に覆い隠す設定が可能です。

表示モードは直接設定できません。代わりに、preferredDisplayMode プロパティを使って希望の表示モードを指定します。Split view controller は指定された表示モードを尊重しますが、スペースの制約によって、実際の表示ははそのようにならないかもしれません。例えば、horizontally compact environment(水平方向に表示幅が狭い状況)においては、子ビューコントローラを並べて表示することはできません。設定可能な条件は UISplitViewController.DisplayMode を参照してください。

ジェスチャーとボタンのサポート(Gesture and Button Support)

ユーザの操作によって、現在の表示モードを切り替える方法がいくつかあります。

Split view controller は、スワイプによって表示モードを変更できるよう、ビルトインのジェスチャー処理が組み込まれています。presentsWithGesture プロパティを false にすることで、このジェスチャーを制限することができます。例えば、primary ビューコントロラーを常に表示させたい場合には、このプロパティを false にしたいかもしれません。

presentsWithGesturetrue の場合、split view controller は、表示モードを切り替えるための特別な bar button item を表示します。split view controller はこの挙動や見た目、位置を管理します。UISplitViewController.SplitBehavior.tile の場合は sidebar toggle アイコンが、UISplitViewController.SplitBehavior.overlayUISplitViewController.SplitBehavior.displace の場合は back-chevron アイコンが表示されます。このボタンをタップすると、現在の表示モードと分割の挙動に基づいて、新しい表示モードに遷移します。

3カラムの split view インタフェース(UISplitViewController.Style.tripleColumn)に対して、表示モードに影響を与える他のプロパティは showsSecondaryOnlyButton です。このプロパティが true の時、split view controller は、表示モードを UISplitViewController.DisplayMode.secondaryOnly とトグルするために、他の bar button item を表示させます。split view controller はこのアイテムの挙動や見た目、位置を管理します。これは、double-arrow アイコンとして表示され、ユーザーがタップした時、表示モードを UISplitViewController.DisplayMode.secondaryOnly とトグルします。

分割の挙動(Split Behavior)

split view controller は、secondary ビューコントローラが、どのように他のビューコントローラと連携しながら表示されるかを制御します。secondary ビューコントローラが、常に他のビューコントローラと横並びに表示されるようにしたり、部分的に覆いかぶされるようにしたり、他のビューコントローラのためにスペースを空けるために画面外に表示するようにしたり、挙動を設定することができます。

分割の挙動を直接設定することはできません。代わりに、preferredSplitBehavior プロパティを使って希望の表示モードを指定します。このプロパティの変更は、次のレイアウト遷移後に有効になります。split view controller は実際の分割の挙動を splitBehavior プロパティに反映させます。splitBehavior プロパティの値は、どの表示モードを有効にするかに影響を与えます。設定可能な条件は UISplitViewController.SplitBehavior を参照してください。

カラム幅のカスタマイズ(Column Width Customization)

preferredPrimaryColumnWidthFractionpreferredSupplementaryColumnWidthFraction を調整することで、primary カラムと supplementary カラムに、独自の幅を指定することができます。もし指定しない場合はデフォルト値として automaticDimension が設定され、利用可能なスペースに基づいて、システムが適切な挙動を決定します。

メッセージの配送(Message Forwarding)

split view controller はアプリのウィンドウと子ビューコントローラの間を仲裁します。そのため、子ビューコントローラへの全てのメッセージは必ず split view controller を経由し、適切に配送されます。例えば、ビューの表示と非表示のメッセージは、対応する子ビューコントローラが実際にスクリーンに表示される時だけ送信されます。

状態の保存(State Preservation)

もし、split view controller の restorationIdentifier プロパティに値をセットした場合、有効な restoration identifier を持つ子ビューコントローラを保持します。次の起動サイクルで、split view controller は、保持した子ビューコントローラをそれらの前の状態にリストアします。split view controller のそれぞれの子ビューコントローラは、同じ restoration identifier を利用するかもしれません。split view controller は、それぞれの子ビューコントローラの restoration path がユニークになることを保証するために、自動的に追加の情報を保存します。

訳者あとがき

実際に動かしてみないとよくわからん!