macOS NSView 实现 drag and drop 拖放

栏目: IOS · 发布时间: 6年前

内容简介:macOS 实现 drag and drop 拖放很复杂,因为苹果的开发者中心把很多 demo 代码都不知道放到哪里去了,你用苹果开发者网站找不到 Sample Code,用 Xcode 帮助也没法找到。而通过搜索引擎找的话,各种例子不是老旧就是没讲对。其实 drag and drop 很简单。有两个概念:DraggingSource 和 DraggingDestination。你可以把拖放理解两个容器之间的交互,你要将某物从A拖到B然后放下。最重要的一点,不管实现什么接口什么方法,你必须告诉系统什么时候拖

macOS 实现 drag and drop 拖放很复杂,因为苹果的开发者中心把很多 demo 代码都不知道放到哪里去了,你用苹果开发者网站找不到 Sample Code,用 Xcode 帮助也没法找到。而通过搜索引擎找的话,各种例子不是老旧就是没讲对。

其实 drag and drop 很简单。有两个概念:DraggingSource 和 DraggingDestination。你可以把拖放理解两个容器之间的交互,你要将某物从A拖到B然后放下。

最重要的一点,不管实现什么接口什么方法,你必须告诉系统什么时候拖放开始了。我看了很多文章,都没有重点提到这一点。也就是说,不管你实现什么接口都没有用,你必须主动告诉系统拖放已经开始了。所以,在你的代码中明确地告诉系统这一点,一般是鼠标按住的时候。

当你决定拖放已经开始了,就调用这个方法:

// NSView 的方法,当你决定 drag-n-drop 可以开始的时候,调用此方法
- (NSDraggingSession *)beginDraggingSessionWithItems:(NSArray
<nsdraggingitem>
  *)items event:(NSEvent *)event source:(id
 <nsdraggingsource>
  )source;

 </nsdraggingsource>
</nsdraggingitem>

调用这个方法之后,系统会自动地更新拖动过程的示意图的位置。当然,你要告诉系统示意图的开始位置和图片,通过上面的方法中的参数。另外,drag-n-drop 通过剪贴板在源和目的之间进行通信,所以剪贴板充当通信信道。下面的代码配置了通信信道和示意图:

// NSPasteboardItem 用于在 drag-n-drap 的双方之间进行通信
NSPasteboardItem *pbItem = [NSPasteboardItem new];
// 指定要传输的数据类型,最后要传输的数据由 NSPasteboardItemDataProvider 提供
[pbItem setDataProvider:self forTypes:@[NSPasteboardTypeString]];
// NSDraggingItem 用于显示 drag-n-drop 过程的示意图
NSDraggingItem *dragItem = [[NSDraggingItem alloc] initWithPasteboardWriter:pbItem];
NSImage *img = [NSImage imageNamed:NSImageNameHomeTemplate];
NSRect frame = NSMakeRect(0, 0, img.size.width, img.size.height);
// draggingFrame 用于指定示意图的初始位置(在当前 NSView 中),contents 是示意图(NSImage)
[dragItem setDraggingFrame:frame contents:img];

这认为用网络通信模型来理解会更好,网络和通信是一个广义的概念,可以解释很多东西,我之前有文章介绍过: http://www.ideawu.net/blog/archives/528.html

弄明白了上面的之后,你再查看这几个接口就懂了:NSDraggingSource, NSDraggingDestination, NSPasteboardItemDataProvider


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

用户体验面面观

用户体验面面观

[美] 库涅夫斯基(Mike Kuniavsky) / 汤海 / 清华大学出版社 / 2010-5 / 69.00

这是一本专注于用户研究和用户体验的经典读物,同时也是一本容易上手的实战手册,从实践者的角度,着重讨论和阐述了用户研究的重要性、主要的用户研究方法和工具,同时借助于实例介绍了相关的应用。全书共3部分18章,深度剖析了何为优秀的用户设计,用户体验包括哪些研究方法和工具,如何 得出和分析用户体验调查结果等。一起来看看 《用户体验面面观》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

URL 编码/解码
URL 编码/解码

URL 编码/解码