如何在拖动中更改拖放图像?

Ben*_*ieb 7 macos cocoa drag-and-drop nsdraggingitem

所以我想将一个对象从一个源拖动到多个潜在目的地.当对象在每个目的地上时,我希望它"变形"为不同的图像.从NSDragSource的角度来看,有一种直接的方法吗?

Jon*_*iev 17

您可以通过使用这样做enumerateDraggingItemsWithOptions:的方法NSDraggingInfo在拖动目的地的处理方法(即-你实现的NSDraggingDestination协议).

例如:

- (NSDragOperation)draggingUpdated:(id < NSDraggingInfo >)sender
{
    NSImage* newDragImage = <take it from wherever>;
    [sender enumerateDraggingItemsWithOptions:0
                                      forView:sender.draggingSource
                                      classes:[NSArray arrayWithObject:[NSPasteboardItem class]]
                                searchOptions:nil
                                   usingBlock:^(NSDraggingItem *draggingItem, NSInteger idx, BOOL *stop) {
                                       NSRect theFrame = draggingItem.draggingFrame;
                                       theFrame.size = newDragImage.size;
                                       [draggingItem setDraggingFrame:theFrame contents:newDragImage];
                                       *stop = NO;
                                   }];
}
Run Code Online (Sandbox Code Playgroud)


Ben*_*ieb 5

Joshua Nozzi发布了一个很好的方法:http://joshua.nozzi.name/2009/10/jlndrageffectmanager/


Lei*_*tzn 3

仅使用拖动源 API 无法做到这一点。

如果您查看 Interface Builder,它会执行与您想要的类似的操作。当您将按钮拖出库时,该按钮会在拖动过程中产生动画效果。

根据大多数人的说法,苹果这样做的方式是将拖动图像制作为小的透明图像。然后他们创建一个窗口并让它跟随鼠标。然后,您可以使用该窗口执行您想要的任何类型的动画。

  • 至少从 10.7+ 开始,接受的响应不再正确 - 请参阅 Иван Георгиев 答案,了解当前在拖动中更改内容的方法! (6认同)