説明
NSCollectionViewLayout
自動レイアウトを使用してアイテムのサイズを決定するカスタム サブクラスを作成しようとしています。このレイアウトでは、アイテムが上から下に配置されます。すべてのアイテムは同じ幅を共有しますが、各アイテムの高さはそのコンテンツによって決定されます。UITableView
macOSのレイアウトと考えてください。
予測
初期レイアウト属性は、レイアウトのprepare()
メソッドで計算され、 を介してコレクション ビューに渡されます layoutAttributesForElements(in:)
。これらの属性は、表示する必要がある項目を決定するためにコレクション ビューによって使用されます。これらのアイテムはコレクション ビューのデリゲートによって提供され、各アイテムのapply(_:)
メソッドが呼び出されてそのビュー プロパティが設定されます。
次に、コレクション ビューはアイテムのpreferredLayoutAttributesFitting(_:)
メソッドを呼び出して、そのコンテンツのフィッティング サイズを計算します。返された属性は、コレクション ビュー レイアウトのメソッドに渡されますshouldInvalidateLayout(forPreferredLayoutAttributes:withOriginalAttributes:)
。ここで、レイアウトは、新しい属性に応じて調整を行う必要があるかどうかを判断し、そのブール値の決定をコレクション ビューに返します。
レイアウトを無効にする必要があるとレイアウトが判断した場合、コレクション ビューはそれinvalidationContext(forPreferredLayoutAttributes:withOriginalAttributes:)
自体を更新する方法について、レイアウトから特定の情報を取得するために呼び出します。その後、コレクション ビューが を呼び出すinvalidationContext(forPreferredLayoutAttributes:withOriginalAttributes:)
と、レイアウトはこれらの変更を適用できます。
このプロセスは、レイアウト アイテムごとshouldInvalidateLayout(forPreferredLayoutAttributes:withOriginalAttributes:)
に返されるまで繰り返され、コレクション ビューがアイテムを画面に表示するように促されます。false
前提
のListLayout
サブクラスは、「推定された」ポイントの初期高さを持つNSCollectionViewLayout
それぞれのレイアウト属性の初期セットを作成できます。Auto Layout を使用して各アイテムの実際の高さを決定することを想定しているため、この初期値は重要ではありません。NSCollectionViewItem
10
その後、レイアウトは を介してこれらの初期属性の正しいセットを提供できますlayoutAttributesForElements(in:)
。
のTextFieldItem
サブクラスには、とプロパティの両方に設定さNSCollectionViewItem
れた単一のNSTextField
インスタンスが含まれます。このビューのプロパティは false に設定されており、垂直方向のコンテンツの圧縮耐性の優先順位が必要です。項目のメソッドがオーバーライドされ、テキスト フィールドが指定された属性によって提供される幅に設定されます。項目のメソッドがオーバーライドされ、優先属性の高さがテキスト フィールドのプロパティと等しくなるように設定されます。view
textField
translatesAutoresizingMaskIntoConstraints
apply(_:)
preferredMaxLayoutWidth
preferredLayoutAttributesFitting(_:)
intrinsicContentSize
コレクション ビューにはTextFieldItem
、複数行のテキストが入力されたインスタンスが用意されています。
それぞれのメソッドの後にそのメソッドが呼び出されTextFieldItem
、続いてレイアウトのとメソッドの両方が呼び出されることが予想されます。preferredLayoutAttributesFitting(_:)
apply(_:)
shouldInvalidateLayout(forPreferredLayoutAttributes:withOriginalAttributes:)
invalidationContext(forPreferredLayoutAttributes:withOriginalAttributes:)
ただし、 もpreferredLayoutAttributesFitting(_:)
も も、プレイグラウンドの実行時に呼び出されるshouldInvalidateLayout(forPreferredLayoutAttributes:withOriginalAttributes:)
ことはありません。invalidationContext(forPreferredLayoutAttributes:withOriginalAttributes:)
その結果、各アイテムの高さは最初の「推定」高さのままになります。
質問
私が見逃しているものNSCollectionViewLayout
と自動レイアウトがあるに違いありませんが、それを示すドキュメントは見つかりませんでした。
コレクション ビューのライフサイクルのさまざまな時点でこれらのメソッドを手動で呼び出してみましたが、計算された属性を調整するためにレイアウトを正しくトリガーすることはできませんでした。
呼び出す必要があることを示すために、コレクション ビュー、そのレイアウト、またはアイテムに設定する必要があるプロパティはありますpreferredLayoutAttributesFitting(_:)
か? 自動レイアウトはNSCollectionViewFlowLayout
とのサブクラスでのみサポートされNSCollectionViewGridLayout
ますか? NSCollectionViewLayout
または、インスタンスのライフサイクルを誤解していますか?