我想在我的应用程序中实现相同的效果,但找不到正确的方法.
我有一个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 – 拖出来删除项目所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)