Cell Configuration
Content Configuration の良さ
同じ Content Configuration を利用する View (セル) の間で設定を使いまわせる
Confugration を Composable に扱うことができる
以前の UITableViewCell では、全機能が Cell クラス自体に組み込まれていた
レイアウトや見た目を独立して利用できるようになった
サポートする任意の Cell や View に直接適用できる
軽量な値型
既存の構成を気にしないで常に状態を作り直して適用できる
Configuration の状態が Single source of truth となる
Background Configuration
background color
visual effect
stroke
inset 及び corner radius
custom view
Content Configuration
Image
Text
Secondary Text
Layout metrics and behaviors
Configuration State
Cell や View の設定に利用するさまざまな入力
selected, focused, swiped
Custom State も構成できる
Content/Background Configuration は、Configuration state によって書き換えられる
概要
以下の2種類が存在する。
Background Configuration
View の背景の見た目の設定
Content Configuration
画像やテキスト等のコンテンツや、tintColor や padding 等のコンテンツの見た目の設定 updateConfiguration
セルの表示前に必ず呼び出される
configuration state が変わるたびに呼び出される
setNeedsUpdateConfiguration() を呼び出すと明示的に更新できる
まとめると、以下のような感じ
UIContentView
Configuration に応じてコンテンツを描画するView
UIContentContentConfiguration
表示するコンテンツ内容
タイトル, アクセサリ, テキスト色, フォント等
UIConfigurationState によって変化する
UIConfigurationState
ContentView の状態
isEnabled, isSelected, isDisabled 等
Content Configuration を適用な View を表現するとてもシンプルな protocol。なにせ configuration プロパティを持っていることしか求められていない。このプロパティを通して、現在の設定の取得と、設定の適用が行えることが求められる。 Content View に適用可能なコンテンツ設定に適合させる protocol。コンテンツの見た目とコンテンツ自体を保持できる。こちらもシンプルな protocol で、makeContentView() でこの設定を適用した Content View の生成が、updated(for:) でコンテンツの状態に応じた設定の生成が行える (後述)。 この protocol に適用している struct として、UIListContentConfiguration がある。これはリストベースのコンテンツのためのコンテンツ設定。リストベースのコンテンツとは、セルやヘッダー、フッター等を指す。この struct ができることは、主に以下の3つ。 標準で様々な設定が用意されている
コンテンツの設定
コンテンツの見た目
Content Configuration が決まると、Conent View の表示内容とその見た目が決まることになる。ただ、Content View はその種別によって様々な状態を持つ場合があり、状態によって表示内容が見た目が変化することがある。例えば、UIButton であれば、Enabled の時と Disabled の時ではボタンの色を変えたい、みたいなことがある。この 状態 を表現するのが UIConfigurationState であり、状態に応じた表示内容とその見た目 は updated(for:) によって取得できるようになっている... ただし、ドキュメント的には、開発者が独自にカスタマイズしていないプロパティに対し、状態に応じたシステムデフォルト値を適用した設定 を返すように見える。 これまでは、ボタンなら、ボタンに各状態に応じた見た目の設定を行っていた (enaled なら tintColor が青、disabled だったら灰色、みたいな)。が、Content Configuration を利用する場合は、そういった内部状態の管理は View 側では行われず、View は飽くまで指定された表示内容と見た目の反映のみを行い、状態管理は View の外部で行って、必要に応じて設定を適用する必要があるようだ。
その名の通り、View の見た目に影響を与える 状態 を保持するオブジェクトが適合すべき protocol。この protocol 自体は状態として traitCollection を保持するのと、保持された状態を subscript で取り出す I/F が定義されている。そのため、Configuration は最低でも trait を状態として保持することになる。 参考