objective-c – 拖出来删除项目

objective-c – 拖出来删除项目,第1张

概述你知道这个效果,当你拖出一个项目从码头和云拖动光标出现,当你放开它消失与poof效果?同样的,在XCode中,当您将线程号外围的断点拖动时,相同. 我想在我的应用程序中实现相同的效果,但找不到正确的方法. 我有一个NSImageView后代来实现NSDraggingSource和NSDraggingDestination协议.我有几个这种观点的实例,允许在其他的内容之间拖拽内容(在这种情况下会发生 你知道这个效果,当你拖出一个项目从码头和云拖动光标出现,当你放开它消失与poof效果?同样的,在XCode中,当您将线程号外围的断点拖动时,相同.

我想在我的应用程序中实现相同的效果,但找不到正确的方法.

我有一个NSImageVIEw后代来实现NSDraggingSource和NSDraggingDestination协议.我有几个这种观点的实例,允许在其他的内容之间拖拽内容(在这种情况下会发生复制 *** 作,但这只是显示我已经拖放并且完全用于标准任务).

现在,当我将图像从视图中拖出到任何地方(除了另一个视图实例)之后,我想删除删除 *** 作.但是拖动 *** 作完全由目标视图控制.我可以设法让他们以我想要的方式做出回应(即使这将是很多工作),但如果我拖动到我的应用程序之外,它将完全失败.

如果我可以获得删除拖动 *** 作,我可以通过以下方式轻松处理:

- (voID)draggedImage: (NSImage *)image             endedAt: (NSPoint)screenPoint           operation: (NSDragOperation)operation{    if (operation == NSDragOperationDelete) {        NSRect rect = [self.window convertRectToScreen: [self convertRect: self.frame fromVIEw: nil]];        NSShowAnimationEffect(NSAnimationEffectPoof,rect.origin,self.bounds.size,nil,NulL);    }}

我已经尝试设置删除光标:

- (voID)draggingSession: (NSDraggingSession *)session           movedtopoint: (NSPoint)screenPoint{    if (!NSPointInRect(screenPoint,self.window.frame)) {        [[NSCursor disappearingItemCursor] set];    }}

(为了简单起见,这是目前整个风的).只要我没有打桌面或查找器窗口,这个工作就可以了.在开始闪烁时,可能是因为Finder同时设置了自己的拖动光标.当我撞到码头时,这完全没有效果.当我定义我自己的粘贴板数据类型时也会发生这种情况.

此外,我的应用程序中任何其他drop启用的视图仍然会接受我不想发生的拖动数据(例如NSTextVIEw)(我正在使用自定义方案写入NSURL到拖动粘贴板).

更新:

我进一步走了几步.正如彼得已经指出的那样,处理dragingSession是必不可少的:sourceOperationmaskForDraggingContext:在我的代码中看起来如此:

- (NSDragOperation)       draggingSession: (NSDraggingSession *)session    sourceOperationMaskForDraggingContext: (NSDraggingContext)context;{    switch(context) {        case NSDraggingContextoutsIDeApplication:            return NSDragOperationDelete;            break;        case NSDraggingContextWithinApplication:        default:            return NSDragOperationDelete | NSDragOperationMove;            break;    }}

这解决了2个问题:1)在应用程序之外拖动 *** 作根本不被接受,2)它保持所有标准视图不接受此 *** 作(因为NSOutlineVIEw,NSTextVIEw等不处理给定的拖动 *** 作).另外,我创建了一个自己的粘贴板数据类型,但这似乎没有必要.仍然有一个自己更清楚.

不幸的是,放弃我的NSImageVIEw后代(在应用程序内外)不会在draggedImage中给我NSDragOperationDelete:endingAt:operation :(上面指定的)但是NSDragOperationNone.此外,将鼠标移到应用程序外部的拖动光标是不允许的,而不是消失项目.所以,如果有人可以解决这两件事,我会接受它作为我的问题的答案.

解决方法 可能有一个较少的方法来做到这一点,但我可以想到一种可能性:一旦拖动开始,创建一个透明的,无边界的窗口大小的桌面是一个虚拟拖动目标.您可能需要调用-setIgnoresMouseEvents:使用“NO”即使透明也可以接收它.您还必须将其窗口级别设置在菜单栏(NSMainMenuWindowLevel 1)上方,以确保您的窗口仍被截取到菜单栏或Dock的拖动.

作为拖曳目的地,此窗口必须检查您的一个图像视图是否在光标下.您可以使用[NSWindow windowNumberAtPoint:belowWindowWithWindowNumber:]查找窗口下方的透明覆盖窗口下方的窗口.然后使用 – [NSApplication windowWithWindowNumber:]确定它是否是您的应用程序的一个窗口,如果是,请在其内容视图上调用 – [NSVIEw hitTest:](适当地转换光标坐标)以查找视图.然后,您可以根据需要将NSDraggingDestination方法转发到该视图.

总结

以上是内存溢出为你收集整理的objective-c – 拖出来删除项目全部内容,希望文章能够帮你解决objective-c – 拖出来删除项目所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1026941.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存