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

时间:2009-10-10 03:27:07

标签: macos cocoa drag-and-drop nsdraggingitem

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

4 个答案:

答案 0 :(得分: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;
                                   }];
}

答案 1 :(得分:5)

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

答案 2 :(得分:4)

查看NSDraggingInfo的enumerateDraggingItemsWithOptions方法。

答案 3 :(得分:3)

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

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

根据大多数人的说法,Apple正在这样做的方法是使拖动图像成为一个小的透明图像。然后他们创建一个窗口并按照鼠标操作。然后,您可以使用该窗口执行任何类型的动画。