問題タブ [nscollectionviewitem]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
swift - NSCollectionView は、すべての NSCollectionViewItems を同じ時点でレンダリングします
プログラムで単純なものを作成しようとしていNSCollectionView
ます。私はそれを設定していますNSViewController
:
を設定する方法は次のNSCollectionViewItem
とおりです。
そして、これが私がNSView
内部で動作するカスタムを作成する方法ですNSCollectionViewItem
:
NSCollectionViewFlowLayout
現在、以下に示すように、 に準拠し、すべてのインデックスNSCollectionViewDelegateFlowLayout
を提供するを使用しているという事実にもかかわらず、結果のサイズは常に 0 です。sizeForItemAt
CollectionViewItemView
オンラインのサンプル プロジェクトでは、作成者は常にNSZeroRect
を のフレームにフィードしNSCollectionViewItem
ます。customNSRect
を指定すると、常に互いの上にレンダリングされます (フレームの原点は常に同じであるため)。
これを行う適切な方法は何ですか?私は途方に暮れています。NSCollectionView
が に応答しないのはなぜNSCollectionViewDelegateFlowLayout
ですか?
macos - NSCollectionViewItem の画像にドラッグできません
Finder に似たフォルダー ブラウザー アプリケーションを設計しています。ユーザーがアプリケーションの外部からファイルをドラッグして、アプリケーション内のフォルダーにドロップできるようにしたいと考えています。これにより、ドラッグされたアイテムがそのフォルダーに追加されます。
私のカスタムNSCollectionViewItem
オブジェクトArchiveCollectionViewItem
は、単一のNSImageView
とで構成されていNSTextField
ます。画像ビューはArchiveCollectionViewItem
の imageView アウトレットに接続され、テキスト フィールドは textField アウトレットに接続されます。
でcollectionView:itemForRepresentedObjectAtIndexPath:
、NSCollectionViewItem に対応するアイテムを見つけて表示します。
ArchiveCollectionViewItem
の setArchiveItemViewModel メソッドは次のとおりです。
アイテムが の画像にドラッグされた場合を除いて、すべてが意図したとおりに機能しArchiveCollectionViewItem
ます。の非画像部分にアイテムをドラッグするとArchiveCollectionViewItem
、有効なドロップを示す緑色のプラス記号が表示されます。
ただし、アイテムを画像部分にドラッグすると、緑色のプラス記号が消えます。さらに、collectionView:validateDrop:proposedIndexPath:dropOperation:
呼び出されません:
ArchiveCollectionViewItem
ビュー全体がドロップを受け入れるようにするにはどうすればよいですか? それとも、これは不可能/許可されていませんか?
他のほとんどのNSCollectionView
ドラッグ アンド ドロップに関する質問は、アプリケーション内 (再配置) またはアプリケーション内からアプリケーション外へのドラッグ アンド ドロップに焦点を当てています。明確にするために、どちらも私のユースケースではありません。私は(これまでのところ)私のものに似た別のSOの質問を見つけることができなかったので、存在する場合は、謝罪を受け入れてリンクしてください。
macos - カスタム NSCollectionViewLayout サブクラスで無効化コンテキスト (forPreferredLayoutAttributes:withOriginalAttributes:) が呼び出されない
説明
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
または、インスタンスのライフサイクルを誤解していますか?