防止NSCollectionView在拖动过程中“提起”项目

时间:2019-01-31 18:43:07

标签: swift cocoa nscollectionview

我知道如何为NSCollectionView进行拖放操作,但似乎无法阻止它“将”项目从视图中“抬起”。

我当前的解决方案是实施

func collectionView(_ collectionView: NSCollectionView, pasteboardWriterForItemAt indexPath: IndexPath) -> NSPasteboardWriting?

来自NSCollectionViewDelegate,以确保

func collectionView(_ collectionView: NSCollectionView, draggingImageForItemsAt indexPaths: Set<IndexPath>, with event: NSEvent, offset dragImageOffset: NSPointPointer) -> NSImage

IS 调用,我可以在其中提供自己的拖动图像。但是,这些不会聚集或提供显示要拖动多少个项目的图标。

问题在于,当我实现前一种方法时,我似乎无所事事(包括覆盖NSCollectionViewItem的draggingImageComponents)似乎阻止了将项目从集合视图中“抬起”,从而留下了空白

拖动Photos.app中的图像和Finder.app中的文件(图标视图)不会抬起该项目,因此希望可以实现。

1 个答案:

答案 0 :(得分:2)

这似乎与NSCollectionView - dragging shows a “hole” - want it to look like the Finder

是相同的问题

我最初的解决方案是对集合视图项使用自定义视图。在子类中,我重写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