問題タブ [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.

0 投票する
1 に答える
682 参照

swift - NSCollectionView は、すべての NSCollectionViewItems を同じ時点でレンダリングします

プログラムで単純なものを作成しようとしていNSCollectionViewます。私はそれを設定していますNSViewController

を設定する方法は次のNSCollectionViewItemとおりです。

そして、これが私がNSView内部で動作するカスタムを作成する方法ですNSCollectionViewItem:

NSCollectionViewFlowLayout現在、以下に示すように、 に準拠し、すべてのインデックスNSCollectionViewDelegateFlowLayoutを提供するを使用しているという事実にもかかわらず、結果のサイズは常に 0 です。sizeForItemAtCollectionViewItemView

NSCollectionView

オンラインのサンプル プロジェクトでは、作成者は常にNSZeroRectを のフレームにフィードしNSCollectionViewItemます。customNSRectを指定すると、常に互いの上にレンダリングされます (フレームの原点は常に同じであるため)。

これを行う適切な方法は何ですか?私は途方に暮れています。NSCollectionViewが に応答しないのはなぜNSCollectionViewDelegateFlowLayoutですか?

0 投票する
1 に答える
129 参照

macos - NSCollectionViewItem の画像にドラッグできません

Finder に似たフォルダー ブラウザー アプリケーションを設計しています。ユーザーがアプリケーションの外部からファイルをドラッグして、アプリケーション内のフォルダーにドロップできるようにしたいと考えています。これにより、ドラッグされたアイテムがそのフォルダーに追加されます。

私のカスタムNSCollectionViewItemオブジェクトArchiveCollectionViewItemは、単一のNSImageViewとで構成されていNSTextFieldます。画像ビューはArchiveCollectionViewItemの imageView アウトレットに接続され、テキスト フィールドは textField アウトレットに接続されます。

collectionView:itemForRepresentedObjectAtIndexPath:、NSCollectionViewItem に対応するアイテムを見つけて表示します。

ArchiveCollectionViewItemの setArchiveItemViewModel メソッドは次のとおりです。

アイテムが の画像にドラッグされた場合を除いて、すべてが意図したとおりに機能しArchiveCollectionViewItemます。の非画像部分にアイテムをドラッグするとArchiveCollectionViewItem、有効なドロップを示す緑色のプラス記号が表示されます。

有効なドロップ

ただし、アイテムを画像部分にドラッグすると、緑色のプラス記号が消えます。さらに、collectionView:validateDrop:proposedIndexPath:dropOperation:呼び出されません:

無効なドロップ

ArchiveCollectionViewItemビュー全体がドロップを受け入れるようにするにはどうすればよいですか? それとも、これは不可能/許可されていませんか?

他のほとんどのNSCollectionViewドラッグ アンド ドロップに関する質問は、アプリケーション内 (再配置) またはアプリケーション内からアプリケーション外へのドラッグ アンド ドロップに焦点を当てています。明確にするために、どちらも私のユースケースではありません。私は(これまでのところ)私のものに似た別のSOの質問を見つけることができなかったので、存在する場合は、謝罪を受け入れてリンクしてください。

0 投票する
1 に答える
339 参照

macos - カスタム NSCollectionViewLayout サブクラスで無効化コンテキスト (forPreferredLayoutAttributes:withOriginalAttributes:) が呼び出されない

関連するサンプル プロジェクトへのリンク

説明

NSCollectionViewLayout自動レイアウトを使用してアイテムのサイズを決定するカスタム サブクラスを作成しようとしています。このレイアウトでは、アイテムが上から下に配置されます。すべてのアイテムは同じ幅を共有しますが、各アイテムの高さはそのコンテンツによって決定されます。UITableViewmacOSのレイアウトと考えてください。

予測

初期レイアウト属性は、レイアウトのprepare()メソッドで計算され、 を介してコレクション ビューに渡されます layoutAttributesForElements(in:)。これらの属性は、表示する必要がある項目を決定するためにコレクション ビューによって使用されます。これらのアイテムはコレクション ビューのデリゲートによって提供され、各アイテムのapply(_:)メソッドが呼び出されてそのビュー プロパティが設定されます。

次に、コレクション ビューはアイテムのpreferredLayoutAttributesFitting(_:)メソッドを呼び出して、そのコンテンツのフィッティング サイズを計算します。返された属性は、コレクション ビュー レイアウトのメソッドに渡されますshouldInvalidateLayout(forPreferredLayoutAttributes:withOriginalAttributes:)。ここで、レイアウトは、新しい属性に応じて調整を行う必要があるかどうかを判断し、そのブール値の決定をコレクション ビューに返します。

レイアウトを無効にする必要があるとレイアウトが判断した場合、コレクション ビューはそれinvalidationContext(forPreferredLayoutAttributes:withOriginalAttributes:)自体を更新する方法について、レイアウトから特定の情報を取得するために呼び出します。その後、コレクション ビューが を呼び出すinvalidationContext(forPreferredLayoutAttributes:withOriginalAttributes:)と、レイアウトはこれらの変更を適用できます。

このプロセスは、レイアウト アイテムごとshouldInvalidateLayout(forPreferredLayoutAttributes:withOriginalAttributes:)に返されるまで繰り返され、コレクション ビューがアイテムを画面に表示するように促されます。false

前提

ListLayoutサブクラスは、「推定された」ポイントの初期高さを持つNSCollectionViewLayoutそれぞれのレイアウト属性の初期セットを作成できます。Auto Layout を使用して各アイテムの実際の高さを決定することを想定しているため、この初期値は重要ではありません。NSCollectionViewItem10

その後、レイアウトは を介し​​てこれらの初期属性の正しいセットを提供できますlayoutAttributesForElements(in:)

TextFieldItemサブクラスには、とプロパティの両方に設定さNSCollectionViewItemれた単一のNSTextFieldインスタンスが含まれます。このビューのプロパティは false に設定されており、垂直方向のコンテンツの圧縮耐性の優先順位が必要です。項目のメソッドがオーバーライドされ、テキスト フィールドが指定された属性によって提供される幅に設定されます。項目のメソッドがオーバーライドされ、優先属性の高さがテキスト フィールドのプロパティと等しくなるように設定されます。viewtextFieldtranslatesAutoresizingMaskIntoConstraintsapply(_:)preferredMaxLayoutWidthpreferredLayoutAttributesFitting(_:)intrinsicContentSize

コレクション ビューにはTextFieldItem、複数行のテキストが入力されたインスタンスが用意されています。

それぞれのメソッドの後にそのメソッドが呼び出されTextFieldItem、続いてレイアウトのとメソッドの両方が呼び出されることが予想されます。preferredLayoutAttributesFitting(_:)apply(_:)shouldInvalidateLayout(forPreferredLayoutAttributes:withOriginalAttributes:)invalidationContext(forPreferredLayoutAttributes:withOriginalAttributes:)

ただし、 もpreferredLayoutAttributesFitting(_:)も も、プレイグラウンドの実行時に呼び出されるshouldInvalidateLayout(forPreferredLayoutAttributes:withOriginalAttributes:)ことはありません。invalidationContext(forPreferredLayoutAttributes:withOriginalAttributes:)その結果、各アイテムの高さは最初の「推定」高さのままになります。

各テキスト フィールドには 3 行のテキストが表示されますが、最初の行の上部しか表示されません。

質問

私が見逃しているものNSCollectionViewLayoutと自動レイアウトがあるに違いありませんが、それを示すドキュメントは見つかりませんでした。

コレクション ビューのライフサイクルのさまざまな時点でこれらのメソッドを手動で呼び出してみましたが、計算された属性を調整するためにレイアウトを正しくトリガーすることはできませんでした。

呼び出す必要があることを示すために、コレクション ビュー、そのレイアウト、またはアイテムに設定する必要があるプロパティはありますpreferredLayoutAttributesFitting(_:)か? 自動レイアウトはNSCollectionViewFlowLayoutとのサブクラスでのみサポートされNSCollectionViewGridLayoutますか? NSCollectionViewLayoutまたは、インスタンスのライフサイクルを誤解していますか?