NSCollectionView - перетаскивание показывает "дыру" - хотите, чтобы она выглядела как Finder
У меня есть NSCollectionView. Когда я перетаскиваю элементы (вокруг вида или за его пределами), я получаю правильный внешний вид, но при перетаскивании ячейка пуста (см. Анимированный GIF ниже). Требуемое поведение должно быть таким же, как в Finder, то есть значок должен оставаться на месте, а перетаскиваемое изображение появляется в дополнение к нему.
Я пробовал разные вещи безрезультатно. Например, я попытался установить операцию перетаскивания для копирования в sourceOperationMaskForDraggingContext. Другие не помню - они потерпели неудачу, поэтому я удалил эксперименты. Когда перетаскивание завершается, все обновляется правильно, но во время перетаскивания это выглядит неправильно.
Есть ли (надеюсь, простой) способ заставить NSCollectionView при перетаскивании вести себя как Finder? Благодарю.
[
0 ответов
Это, по-видимому, тот же вопрос, что и Предотвращение NSCollectionView "поднятия" элемента во время перетаскивания.
Мое первоначальное решение заключалось в использовании настраиваемого представления для элемента представления коллекции. В моем подклассе я переопределяюsetHidden:
чтобы представление коллекции не скрывало представление моего элемента во время его перетаскивания. У этого были некоторые нежелательные побочные эффекты. Похоже, что NSCollectionView также скрывает представления элементов при изменении макета.
Следующая идея (пока) отлично работает в моем приложении. Когда начинается перетаскивание, я открываю вид элементов.
@interface HGImagesCollectionViewDelegate : NSObject <NSCollectionViewDelegate>
@end
@implementation HGImagesCollectionViewDelegate
- (void)collectionView:(NSCollectionView *)collectionView
draggingSession:(NSDraggingSession *)session
willBeginAtPoint:(NSPoint)screenPoint
forItemsAtIndexPaths:(NSSet<NSIndexPath *> *)indexPaths
{
// Prevent item from being hidden (creating a hole in the grid) while being dragged
for (NSIndexPath *indexPath in indexPaths) {
[[[collectionView itemAtIndexPath:indexPath] view] setHidden:NO];
}
// …
}
@end