NSCollectionView - перетаскивание показывает "дыру" - хотите, чтобы она выглядела как Finder

У меня есть NSCollectionView. Когда я перетаскиваю элементы (вокруг вида или за его пределами), я получаю правильный внешний вид, но при перетаскивании ячейка пуста (см. Анимированный GIF ниже). Требуемое поведение должно быть таким же, как в Finder, то есть значок должен оставаться на месте, а перетаскиваемое изображение появляется в дополнение к нему.

Я пробовал разные вещи безрезультатно. Например, я попытался установить операцию перетаскивания для копирования в sourceOperationMaskForDraggingContext. Другие не помню - они потерпели неудачу, поэтому я удалил эксперименты. Когда перетаскивание завершается, все обновляется правильно, но во время перетаскивания это выглядит неправильно.

Есть ли (надеюсь, простой) способ заставить NSCollectionView при перетаскивании вести себя как Finder? Благодарю.

[Текущее поведение - не желательно [1

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
Другие вопросы по тегам