Cocoa:如何在拖动时改变拖动图像的形状

6
在Interface Builder.app(以及其他一些Cocoa应用程序)中,图像拖动具有非常漂亮/性感的效果,即在您将可拖动项从其窗口拖出时,拖动图像会发生变形。
例如,在Interface Buildler.app中:
1. 显示库面板(⇧⌘L或工具菜单 ->库)。 2. 从库面板中拖出一个项目。
注意:当您将该项目从库面板窗口拖出时,它会从原始列表项的图像变形为所拖动项目的图标图像。
我已经使用正常的Cocoa NSDragSource / NSDragDestination工具完全实现了我的应用程序中的拖放。但是,我找不到一个钩子来执行这种图像变形操作。我通过重写返回初始拖动图像。
-[NSView dragImage:at:offset:event:pasteboard:source:slideBack:]

但这只在拖动开始时调用。

如何表示您想要替换当前的拖动图像(最好使用性感的变形效果)。

4个回答

12
你们抢先一步了。 :-)
是的,JLNDragEffectManager是开源的(请在你的应用程序中标明归属),并可在我的博客上获得。如果没有进行任何修改,它应该可以正常工作,返回到10.5,但我不确定是否可以再往前。其他人链接到它(并且很容易通过谷歌查找),为避免自夸的博客链接,我就不提供链接了。
问题:一位开发者评论并提交了修复拖动偏移支持的代码。我只是还没找时间发布更新。这是我知道的唯一未解决的问题。
改进:我想添加多个“区域”(比如每个文档一个,这样从一个文档拖到另一个文档时,表格行看起来像表格行,但是在窗口外的任何地方都会将它们变成类似于HFS Promise Drag的文件图标)。总有一天...
设计:帖子本身详细介绍了设计的原因和相对简单的变形效果(使用基本的NSAnimation交叉淡入淡出加上缩放)。代码(类以及演示应用程序)经过彻底的模块化和注释。
不链接到我的博客文章,但希望能因我的努力获得赞誉。 ;-)
更新:自10.7以来,类似但集成更好的功能已经可用。如果你的目标是10.7或更高版本,则最好使用新的API。JLNDragEffectManager在10.7上运行正常,因此它可以用于早期的版本。

非常感谢Joshua。这个运行得很完美。另外,博客文章写得很棒! :) 不知道你有没有关于dragoffset的修复链接? - Todd Ditchendorf
如果您最终使用了这个类,请告诉我,我会将您的应用程序添加到源页面上的列表中。 - Joshua Nozzi

5

3

API的支持并不是很好。Joshua Nozzi在这篇博客文章中提供了一个看起来合理的方法。

IB的效果并不是很花哨,只是一个交叉淡入淡出和缩放效果。按住Shift键可以更清楚地看到它。


2

从10.7版本开始,目前的做法是使用

   enumerateDraggingItemsWithOptions:
                             forView:
                             classes:
                       searchOptions:
                          usingBlock:

关于NSDraggingInfo的API。文档很不完善,但是ADC示例如MultiPhotoFrameTableViewPlayground可以很好地说明如何使用这个新机制。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接