微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

objective-c – 拖出来删除项目

你知道这个效果,当你拖出一个项目从码头和云拖动光标出现,当你放开它消失与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方法转发到该视图.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐