ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
モダンなセルの構成
Appで迅速に動的なインターフェイスを構築する、コレクションビューやテーブルビューセルの構成に関する新しいテクノロジーについて説明します。コンテンツを持つセルを簡単に作成し、共通のスタイルを適用するために使用できるコンフィグレーションタイプについて学習します。パワフルなAPIを活用して、異なるステートに対して、セルのアピアランスをカスタマイズしましょう。コードを簡略化し、バグを取り除き、パフォーマンスを向上させるパターンやベストプラクティスを学びましょう。
リソース
関連ビデオ
WWDC22
WWDC21
WWDC20
-
ダウンロード
“こんにちは WWDC2020” こんにちは WWDCへようこそ “最新のセル構成” “最新のセル構成”について話します UIKitエンジニアのタイラーです iOS 14ではUICollectionViewに 新しい機能を導入しています これらは基盤技術の上に構築され― 大きく3つのカテゴリに分類できます データを入力する方法 レイアウトを定義する方法 コンテンツを表示する方法です “Advances in Collection View” セッションで― これらの新機能を紹介しています このセッションでは ビュー構成に焦点を当てます セルのコンテンツとstylingを 構成するための新しいAPIです まずは基本をカバーし― 新しい構成を使ってセルを設定するのが いかに簡単か お伝えします
次に“configuration state”と呼ばれる 新しい概念を説明します これは構成と共に機能し stateごとに 異なる外観を得ることを容易にします
最後に2つの構成タイプを 詳しく見ていきます バックグラウンド構成と コンテンツ構成です それらを使用し 詳細を説明します 最新のセル構成APIの話に入る前に― 例を簡単に見てみましょう iOS 13でtable view cellを構成する方法です
UITableViewを使ったことがある方は 見覚えがあるはずです ここではビルトインのimageViewプロパティと textLabelプロパティを使用し― UITableViewCellで 画像とテキストを表示します これはセル構成の意味を示すための 単純な例です それを念頭に置いて― 同じことを新しい構成APIを使って どのように行うか見てみましょう
これがコンテンツ構成を使って セルを設定する方法です 以前と同じように見えますが 2行のコードが追加されています 細かく説明します まずdefaultContentConfiguration()を セルに要求します これで常に何も設定されていない フレッシュな構成に戻ります しかし この構成には― セルとtable view styleに基づいた default stylingがあります stylingとその他のコンテンツ構成の 機能については また話します 今はコンテンツ構成に 画像とテキストを設定するだけです ここは非常に親しみやすいはずです コンテンツを設定したら 残るステップは1つ contentConfigurationプロパティに設定し 構成をセルに適用します すると セルが更新され 指定した画像とテキストが表示されます このコード行の前だと 画像とテキストの設定は― この“コンテンツ”変数に格納された 構成のローカルコピーのみを変更しました コンテンツ構成を使っているため― UIImageViewやUILabelに 直に触れることはありません すべてのプロパティは 構成自体に設定されます コンテンツ構成を使って セルを設定することに何の得が? 1つはtable view cellを構成するために ここに表示されるコードです これはcollection view cellなど あらゆるセルの構成に使うものと同じで― 実際 コンテンツ構成をサポートする すべてのビューで同じコードが使えます セルではないtable viewの ヘッダやフッタなども含まれます なぜ こんなことが可能なのか? 構成がコンポーザブルだからです 以前のUITableViewCellのように 全機能がセルクラス自体に組み込まれる代わりに これらの標準のセルレイアウトと外観は 独立した部分として利用可能になりました それらをサポートする任意のセルやビューに 直接 接続できます
では実際にコードを実行し― 構成によって得られる他の利点を 説明しましょう
collection view listの中に セルがあります マルチカラムのiPadアプリケーションの 新しいサイドバーの外観を使っています セルに構成した星の画像とテキストが 含まれているのが分かります このセルをいじってみると さらに面白くなります セルをタッチダウンすると ハイライト表示されます そして持ち上げるとセルが選択されます これらはセルのstateの ほんの一例にすぎません セルを追加してみましょう それらを手動で様々なstateにして 外観がどう変化するか見てみます これは同じコンテンツ構成ですが― 異なるstateの異なるセルすべてに 適用されます これらのセルのテキストを入れ替え 各セルのstateを示しましょう ご覧のとおりsidebar list cellの default stylingは― stateによって大きく異なります 構成を使ってセルを設定すると― これだけ様々な外観を すべて自動的に取得します この仕組みについては また話します 新しい構成を試してみましたが― 正確には何なのでしょう?
構成はビューの外観を 特定のstateによって示します コンテンツ styling メトリクス 挙動などです 構成自体は単なるプロパティの集まりです ビュー またはセルに適用して レンダリングするまで何もしません また先ほど説明したように 構成はコンポーザブルです それらをサポートする あらゆるタイプの セルやビューで使用できます 構成には2つのタイプがあります バックグラウンドとコンテンツの構成です これら2つのシステム構成が提供する 機能のいくつかを見てみましょう バックグラウンド構成には 複数のプロパティがあり― 一般的な背景の外観を素早く指定できます 数行のコードで背景の塗りつぶしの色を カスタマイズでき― 視覚効果を設定して 絶妙なぼかしや ストロークや丸みを帯びた角を加えられます もっとカスタムしたいなら 独自のビューを提供することで行えます リストコンテンツ構成は標準のレイアウトを セルやヘッダやフッタに与えます おなじみのUITableViewCellスタイルに 似ています しかしリストコンテンツ構成は さらに強力です 画像 テキストと オプションの二次テキストをサポートし― それぞれのカスタマイズのために 多くのプロパティを公開します より高レベルの挙動も提供します 大量のテキストを表示する 柔軟なレイアウトや― アクセシビリティ・テキストサイズ用の 特別なレイアウトモードです これら2つの構成タイプは 密接に関係しており― いくつか共通の設計原則があります
最も重要な原則の1つは構成が軽量で 非常に安価に作成できることです Swiftで これらは値型です つまり構成がある時 それは常に あなただけのものです あなたが構成に加える変更は― その構成をセルに設定するまで 他のものには影響しません
構成は軽量なので 常にフレッシュな設定から 始める必要があります この例のようにセルに defaultContentConfiguration()を要求します これはセルを初めて構成する時だけでなく― すでに構成されているセルを 更新したい場合にも当てはまります 毎回 フレッシュな構成から始めて 新しいstateに設定します 構成を使用する時 古いstateについて 考える必要はありません 古い構成が適用されているか 気にしないでください 既存の構成を取得して 変更を加えようとしないでください 毎回 フレッシュな構成から始め 好きなように設定し セルに適用します UIKitを長く使っている方は 違和感を抱くかもしれません しかし この考え方が分かると とても楽になります セルに構成を適用すると UIKitが面倒な作業を全部やってくれます 変更点を把握し 必要に応じて ビューを効率的に更新します 先ほどコードを実行した時のように― 構成により 様々なstateの デフォルトの外観が得られます しかし構成も堅牢なインフラストラクチャの上に 構築されており― これらのstateの外観を カスタマイズするために使用できます これについての詳細は また話します
構成は ほんの数行のコードで 高度な挙動にアクセスさせてくれます 背景の外観の変化をアニメ化したい場合― アニメーションの中に 新しい背景構成を設定するだけでいい
使いやすいだけではありません 構成のデザインは 全クラスのバグを排除します 複雑なstateとトランジションを 扱う時は特にです 今 適用されている構成が 真実であることは常に分かります 新しい構成を設定すると その新しい構成は一度に適用されます
最後に構成はパフォーマンスのために ゼロから構築されます これはスムーズなスクロールを 保証するために重要です UIKitはビューとレンダリングの 管理を担当するため― 多くの内部パフォーマンス最適化を 実装できました 無料で得られる標準装備としてです 構成の基本が分かったところで 新しい概念について話しましょう configuration stateです configuration stateは セルやビューの配置に使う様々な入力のことです どんな入力か? ビューを構成する最も一般的な入力は UITraitCollectionのtraitです 例えばsize classやuser interface style content size categoryなどです これらのtraitに加えて― セルとビューは様々なstateで存在します セルが選択されたり ドラッグ&ドロップの対象となったり 一時的に無効にされたり UIKitで一般的なstateの一部です これらに加え アプリケーションには それぞれのcustom stateがあります 皆さんのアプリケーションと そのドメイン固有の様々なstateのことです 例えばセルを構成する際― メッセージングAppでメッセージを 保管するかフラグを立てるか知る必要がある 決済Appでどの取引を処理すべきか view modelを使って セルのコンテンツを追加するなら― view modelを custom stateと見ることもできます これらすべてが configuration stateを形成します 様々なtraitやcustom stateすべての コレクションが― 1ヵ所にまとめられたものです configuration stateはどこにあるか? コレクションやtable viewの 各セルやヘッダやフッタには― 独自のconfiguration stateがあります ここにはセルが3つ それぞれconfiguration stateの中身は 違うかもしれません
では一体 どんなものなのか? ご覧のとおり2種類あります このヘッダのようなビュー用のタイプと セル用のタイプがあります
こちらがview configuration stateです trait collectionから始まり 4つのstateがあります highlighted selected disabled そしてfocused これらは単純なブーリアンです 最後に任意のcustom statesがあります ビューの構成に使いたいstateやデータを 追加できる― key value storageです
これがview configuration stateです ではcell configuration stateは? cell configuration stateは view configuration stateからすべてを受け取り セル固有のstateを追加するものです セルがeditingやswipedや― expandedやdrag and dropのstateでもです configuration stateで できる重要なことの1つは― 新しいstateのために 構成をアップデートすることです バックグラウンドや コンテンツ構成に― アップデートされたものを 返すよう要求できます これにより 新しいstateを反映したプロパティで― 新しい構成のコピーが返されます 例えばバックグラウンド構成で その色が変わった時 あるいはコンテンツ構成で 画像のtint colorとtext colorが変わった時 アップデートされた構成を要求しても 元の構成は変わりません カスタマイズしたプロパティも― アップデートされた構成で維持されます 構成のプロパティは― 一度 設定すると ロックされると思ってください 冒頭で お見せしたデモでは― コンテンツ構成が 外観をアップデートしていました
これは自動構成アップデートのおかげです セルのバックグラウンドか コンテンツ構成を設定した時 セルのconfiguration stateが変わると 自動で構成にアップデートを 返すように要求し― 新しい構成をセルに再適用します これらのプロパティで この挙動を制御できます
自動アップデートは 各stateのdefault stylingを得るのに便利です でも外観をstateに合わせて カスタマイズしたいなら― 自動アップデートを無効化し 自分で構成をアップデートできます では構成をアップデートするコードを どこに置くか? コレクションとtable view cellに関する 新しいメソッド― updateConfiguration(using state:)を使います セルサブクラスで オーバーライドするためのメソッドです 渡されたstateに基づいて セルを構成するコードをここに置けます このメソッドは常に セルが表示する前に呼び出され― configuration stateが変わるたびに 呼び出されます そして新しいstateに合わせて構成できます 構成を使う時は― 過去のstateを気にする必要はありません 毎回 新しい構成にして― プロパティを設定してセルに適用すればいい 構成は その設定と セルへの適用を扱う場所が― コードに1ヵ所だけあるほうがいいでしょう カスタムセルサブクラスを使っているなら― この新しいメソッド updateConfiguration(using state:)が最適です 他の設定やアップデートを集中させるには 最適の場所です 例えば新しいcollection view list cellを 使うなら― このメソッドでセルアクセサリのtint colorを 別のstateに合わせてアップデートできます セルを再構成したい時は― setNeedsUpdateConfiguration()を呼び出し アップデートを要求します
このメソッドで どうセルを設定し― 手動で構成をアップデートするのか 例を見ましょう
まずフレッシュな構成を得るため― セルにdefaultContentConfiguration()を 要求します これで新しいstateに合わせて アップデートされます これによりstateに合わせた system default stylingと構成が得られます 次に表示するitem用の 画像とテキストの構成を設定します 次にカスタマイズを適用します ここではstateが ハイライトか選択されているか確認します もし そうなら 画像とテキストの色を白にします 他の場合は色を指定しません 構成のデフォルト色を使います
最後に新しい構成をセルに設定します 以上です stateが変わるたびに このメソッドが呼び出され― 新しいstateの新しい構成が適用されます これがコンテンツ構成の外観を stateに合わせてカスタマイズする方法です 同じようにバックグラウンド構成も カスタマイズできます
この例ではstateごとに 異なる画像とテキストを設定しています ただ色を変える方法はもう1つあります color transformerと呼ばれる 新しいタイプを使います color transformerは ある色を受け取り― その色を何らかの形で修正して 別の色を返します 例えば 元の色の グレー・スケールを返すなどです color transformerは単純な機能ですが とてもパワフルです 同じ色の入力で異なるcolor transformerから 様々な変異を作成できるからです このようにstateごとに 異なる外観を作ることができます 特定のスタイルやstateにはデフォルトで プリセットのcolor transformerがあり― そのstate固有の外観が与えられます color transformerと入力した色とで― 実際に目にするresolved colorが作られます 以上が構成がstateに合わせて 外観をアップデートする方法でした 次はバックグラウンドと コンテンツ構成を使う際の― 詳しい話を見てみましょう
collection view list cellやtable view cellや table view headers and footersは― どれもデフォルトバックグラウンド構成を― リストやtable viewに基づいて 自動で設定します 何もしなくても 求めるバックグラウンドの外観になります コンテンツ構成は少し違います セルにデフォルトで自動で適用させず― defaultContentConfiguration()メソッドで セルのスタイルに基づき― 前出の例のように フレッシュな構成を得られます
でもバックグラウンドと コンテンツ構成には― デフォルト構成を 好きなスタイルに合わせて簡単に要求できます UIBackgroundConfigurationと― UIListContentConfiguration typeに 直接 行きます ここにsidebar style list cellの 例がいくつかあります 同じようなメソッドが他のセルや ヘッダやフッタのスタイル用にあります では実際にスタイルを見てみましょう
これはステッカーカテゴリのリストです このリストはサイドバーの外観で 構成されています どのセルも― スタイルに合わせたバックグラウンドと コンテンツ構成があります 操作すると stateに合わせ セルの外観がアップデートされるのが見えます
でもサイドバースタイルはcollection view listに使える外観の1つに過ぎません 別の外観に構成すると どうなるか見てみましょう これは同じリストをgroupedに構成したもの これはinset groupedのもの そしてこれがplainの外観です UITableViewで見覚えがあるでしょう collection view listは 新しいスタイルであるsidebar plain styleと 元のサイドバーの外観をサポートします 異なるリスト外観のvisual stylingは― デフォルトのバックグラウンドと コンテンツ構成から来ています ではgroup styleに切り替えましょう 個々のセルを見やすくします そしてテキストサイズ設定を変えると タイプサイズが― どうなるか見てみましょう デフォルトだと すべてが変更に対して同時に対応します テキストサイズを大きくすると 全体のレイアウトもそれに対応します そしてサイズを最大にすると― セルレイアウトが特別なモードになります テキストが画像を包み コンテンツに 与えられたスペースを最大限に使います コンテンツ構成は こうしたレイアウトを サポートするため作られています どういう仕組みか見てみましょう
コンテンツ構成はself-sizing cellで 使えるよう設計されています その高さは柔軟で― 構成と環境に依存します アプリケーションの外観をよりよくします 異なるデバイスサイズやdynamic typeサイズ コンテンツの量やタイプに対応します コンテンツ構成で レイアウトマージンの制御もできます 青で示しました オレンジで示したpaddingプロパティもです コンテンツと共に― これらのものが内部の高さを決定し セルがどうself-sizeするかに影響します 固定の高さを強制せず コンテンツ構成で これらのプロパティを使い レイアウトに影響させ 高さをダイナミックに適応させましょう もう1つ 大事なレイアウトの概念があります 例を見てみましょう ここに3つのセルがあります それぞれ 画像とテキストがあり コンテンツ構成を使っています 今は何も問題ありません では ここで違う画像を使うとします 画像が同じサイズではありません 幅が少し違います 画像とテキストが一直線になっていません その理由は 画像がレディングで整列されており テキストが各画像の端から 同じだけのpaddingで置かれているからです 一直線にするには― 各画像にreserved layout sizeというものを 指定しなければなりません 各コンテンツ構成で画像に 同じreserved layout widthを設定すると 確保されたスペース内で 画像が水平方向に中心に置かれます この絵では 赤い点線の間の距離が各画像における― reserved layout widthです reserved layout sizeは 実際の画像のサイズに影響しません 画像のほうが大きい場合― 範囲から はみ出て表示されます 画像にreserved layout sizeを使うと テキストも直ります 各セルの画像のreserved layout areaに対して 位置を取るからです symbol imageを使うと― UIKitが標準のreserved layout sizeを 自動で適用します 必要であれば non-symbol imageにも手動で要求できます 以上がlist content configuration layoutで 知っておくべきことです 次は構成を導入する際 念頭に置くべきディテールを確認しましょう アップデートし 移行させる既存のコードがあるなら 構成は時に既存プロパティにおいて 相互排他的であることをお忘れなく バックグラウンドを設定すると― バックグラウンドの色と viewプロパティがゼロにリセットされます 逆も同じことが言えます だからバックグラウンド構成を― 同じセルで他のバックグラウンドプロパティを 設定している他のコードと混ぜてはいけません
そしてUITableViewを使っている場合― コンテンツ構成はセルやヘッダやフッタの サブビューに対して優先されます imageViewやtextLabelや detailTextLabelなどです これらのレガシーコンテンツプロパティは 将来 廃止予定です ぜひコンテンツ構成を導入し― そのパワフルな機能や 強化されたカスタマイズ性を活用してください バックグラウンド構成や list content configuration typeは― とてもパワフルです しかし よりカスタムなことをする必要が 今後も時にはあります 構成では 今まで以上に 選択肢がたくさんあります
list content configurationに加え― 関連するlist content viewにも アクセスできます これがレンダリングを実行します 構成を使って このビューを 作成かアップデートするだけで カスタムビューと一緒に サブビューとして追加することができます これにより コンテンツ構成機能を活用し― list content viewを カスタムビューの隣に組み合わせられます 追加の画像ビューやラベルなどです list content viewは ただのUIViewなので― どこでも それだけで使うことができます コレクションやtable viewの外でもです 例えばUIStackViewなど ではリストをまったく作っていない場合は? または完全にカスタムなことをする時は? 構成なら問題ありません セル内に完全にカスタムな ビューヒエラルキーを構築する時でも system configurationを役立てられます 構成はとても軽量なので― デフォルト値のソースとして使えます 例えばカスタムビューにコピーする フォントや色やマージンなどに使えます 構成を直接 適用しなくても構いません
さらに高度な事例として 完全にカスタムな content configuration typeと― それをレンダーする content viewクラスを作成できます list content configurationと 同じように― どのセルでも custom configurationを使えます custom configurationで 今回 話したあらゆる機能を活用できます custom configurationに― 自動で新しいstateに合わせて アップデートさせることもできます どれだけセルが複雑でカスタムでも― 構成のパワーを活用できます 今回は最新のセル構成の要点を 紹介しました バックグラウンドと コンテンツ構成の使い方の簡単さ 同じコードを使い― collection view cellや table view cellを構成できることも見せました 構成はビューのアップデートを 心配せずに― 表示したいものに注力させてくれます 毎回 フレッシュな構成から始めて 好きなように設定しセルに適用すれば あとはUIKitがやってくれます configuration stateを使って― 構成をアップデートし 幅広い外観を作れることも見せました セルの設定にも configuration stateを使えます 今日 話したことはすべて― ニーズに応じてコンポーザブルで 拡張可能にするためのものです ぜひサンプルをダウンロードして これらの新しいAPIを試してみてください バックグラウンドと コンテンツ構成を使って― あなたのアプリケーションのコレクションや table view cellを設定してください リストの構築など その他にもいろいろな情報があるので WWDC20のcollection viewセッションを お見逃しなく
-
-
1:31 - Configuring a UITableViewCell
cell.imageView?.image = UIImage(systemName: "star") cell.textLabel?.text = "Hello WWDC!"
-
1:59 - Configuring a UITableViewCell Using a Content Configuration
var content = cell.defaultContentConfiguration() content.image = UIImage(systemName: "star") content.text = "Hello WWDC!" cell.contentConfiguration = content
-
13:10 - Updating Configurations
let updatedConfiguration = configuration.updated(for: state)
-
16:33 - Customizing Appearance for Different States
override func updateConfiguration(using state: UICellConfigurationState) { var content = self.defaultContentConfiguration().updated(for: state) content.image = self.item.icon content.text = self.item.title if state.isHighlighted || state.isSelected { content.imageProperties.tintColor = .white content.textProperties.color = .white } self.contentConfiguration = content }
-
19:45 - Default Configurations
var background = UIBackgroundConfiguration.listSidebarCell() var content = UIListContentConfiguration.sidebarCell()
-
26:23 - Creating a List Content View
var content = UIListContentConfiguration.cell() // Set up the content configuration as desired... let contentView = UIListContentView(configuration: content)
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。