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

Posted

技术标签:

【中文标题】如何在拖动中更改拖放图像?【英文标题】:How do you change a drag-and-dropped image mid-drag? 【发布时间】:2010-12-05 12:56:57 【问题描述】:

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

【问题讨论】:

【参考方案1】:

您可以在拖动目标的处理程序方法中使用NSDraggingInfoenumerateDraggingItemsWithOptions: 方法(即-您的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;
                                   ];

【讨论】:

【参考方案2】:

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

【讨论】:

是的。这是针对这种特殊效果的插入式管理器。下载包含一个演示应用程序。 如果您最终使用了这个类,请告诉我,我会将您的应用添加到源页面的列表中。【参考方案3】:

查看 NSDraggingInfo 的 enumerateDraggingItemsWithOptions 方法。

【讨论】:

请编辑您的答案以详细说明:您将如何使用该方法来解决此问题?【参考方案4】:

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

如果您查看 Interface Builder,它的功能与您想要的类似。当您将一个按钮拖出库时,该按钮会在拖拽的中间进行动画处理。

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

【讨论】:

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

以上是关于如何在拖动中更改拖放图像?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jQuery 在 div 中多次拖放图像以及在 drop div 中拖放图像?

jQuery拖放 - 如何获取被拖动的元素

如何更改 Angular CDK 拖放的 z-index?

如何多次运行可放置函数

GWT 2.4 HTML 5 拖放 APIS - 拖动时更改光标

如何在 SwiftUI (macOS) 中拖放未捆绑的图像