我有一个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.此外,将鼠标移到应用程序外部的拖动光标是不允许的,而不是消失项目.所以,如果有人可以解决这两件事,我会接受它作为我的问题的答案.
解决方法
作为拖曳目的地,此窗口必须检查您的一个图像视图是否在光标下.您可以使用[NSWindow windowNumberAtPoint:belowWindowWithWindowNumber:]查找窗口下方的透明覆盖窗口下方的窗口.然后使用 – [NSApplication windowWithWindowNumber:]确定它是否是您的应用程序的一个窗口,如果是,请在其内容视图上调用 – [NSView hitTest:](适当地转换光标坐标)以查找视图.然后,您可以根据需要将NSDraggingDestination方法转发到该视图.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。