NSCollectionView
私はいくつかの画像を表示しています。私はNSCollectionViewDelegate
を実装して、どの項目を選択して強調表示するかを指示しました。画像とその名前を描画するために在庫NSCollectionViewItem
を使用しています。ユーザーが項目を選択すると、私のデリゲートは、ハイライト状態の変更に関するメッセージを取得します。NSCollectionViewに現在のセレクションを正しく表示する方法は?
- (void)collectionView:(NSCollectionView *)collectionView
didChangeItemsAtIndexPaths:(NSSet<NSIndexPath *> *)indexPaths
toHighlightState:(NSCollectionViewItemHighlightState)highlightState
{
[collectionView reloadItemsAtIndexPaths:indexPaths];
}
私はdidSelect
/didDeselect
についても同様のことを実行します。NSCollectionViewItem
のview
で
- (void)collectionView:(NSCollectionView *)collectionView
didSelectItemsAtIndexPaths:(nonnull NSSet<NSIndexPath *> *)indexPaths
{
[collectionView reloadItemsAtIndexPaths:indexPaths];
}
を、私がやります以下:
- (void)drawRect:(NSRect)dirtyRect {
[super drawRect:dirtyRect];
NSColor* bgColor = [[self window] backgroundColor];
NSColor* highlightColor = [NSColor selectedControlColor];
NSRect frame = [self bounds];
NSCollectionViewItemHighlightState hlState = [collectionViewItem highlightState];
BOOL selected = [collectionViewItem isSelected];
if ((hlState == NSCollectionViewItemHighlightForSelection) || (selected))
{
[highlightColor setFill];
}
else
{
[bgColor setFill];
}
[NSBezierPath fillRect:frame];
}
私が見ている問題は、ハイライトや選択を描画することが実行されているようだドーム。選択を描画するときは、ほとんどの場合、ユーザーが実際に選択したアイテムになります(何らかの理由で最後のアイテムから離れることが多い)。ユーザーがクリックしたりドラッグしたりしなかった別の項目が選択されることがあります。しばしば、しかし、それは描画しません。
プリントを追加して、-didChangeItemsAtIndexPaths:toHighlightState:
と-didSelectItemsAtIndexPaths:
を呼び出していることを確認しました。私がここで間違っていることは何ですか?
ビューの-drawRect:
メソッドにいくつかのログを追加しました。-didChange*
メソッドで-reloadItemsAtIndexPaths:
を呼び出していても、すべてのトランジションで呼び出されるようには見えません。何故なの?
また、-should/didSelectItemsAtIndexPaths:
が呼び出されても、デリゲートの-should/didDeselectItemsAtIndexPaths:
はこれまでに呼び出されていないようです。何故ですか?
このリンクを試すと役立つことがありますhttp://stackoverflow.com/questions/2541572/selection-highlight-in-nscollectionview?rq=1 –