Mik*_*hke 14 macos cocoa objective-c
你知道当你从停靠栏中拖出一个项目并且那个云拖动光标出现时的效果,当你松开它时会消失效果吗?类似地,在Xcode中,当您在行号装订线外拖动断点时,也会发生同样的情况.
我想在我的应用程序中实现相同的效果,但找不到正确的方法.
我有一个NSImageView后代来实现NSDraggingSource和NSDraggingDestination协议.我有这个视图的几个实例,允许在其他视图之间拖动它们的内容(在这种情况下进行复制操作,但这只是显示我已经拖拽并完全适用于标准任务).
现在,当我将图像从视图拖到任何地方(另一个视图实例除外)时,我希望删除操作在drop上进行.但是,拖动操作完全由目标视图控制.我可以设法让它们以我想要的方式响应(即使这将是很多工作),但是如果我拖到我的应用程序之外它就完全失败了.
如果我可以获得删除拖动操作,我可以通过以下方式轻松处理:
- (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, nil, NULL);
}
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试过像这样设置删除游标:
- (void)draggingSession: (NSDraggingSession *)session
movedToPoint: (NSPoint)screenPoint
{
if (!NSPointInRect(screenPoint, self.window.frame)) {
[[NSCursor disappearingItemCursor] set];
}
}
Run Code Online (Sandbox Code Playgroud)
(为简单起见,这是目前整个windw).只要我没有点击桌面或取景器窗口,这就可以工作.在开始闪烁时,可能是因为Finder同时设置了自己的拖动光标.当我撞到码头时它完全没有效果.当我定义自己的粘贴板数据类型时,也会发生这种情况.
此外,我的应用程序中任何其他启用drop的视图仍然会接受我不希望发生的拖动数据(例如NSTextView)(我正在使用自定义方案将NSURL写入拖动粘贴板).
更新:
我走了几步.正如彼得已经指出的draggingSession:sourceOperationmaskForDraggingContext:那样,在我的代码中处理哪个看起来很重要:
- (NSDragOperation) draggingSession: (NSDraggingSession *)session
sourceOperationMaskForDraggingContext: (NSDraggingContext)context;
{
switch(context) {
case NSDraggingContextOutsideApplication:
return NSDragOperationDelete;
break;
case NSDraggingContextWithinApplication:
default:
return NSDragOperationDelete | NSDragOperationMove;
break;
}
}
Run Code Online (Sandbox Code Playgroud)
这解决了2个问题:1)在应用程序之外根本不接受拖动操作,2)它使所有标准视图也不接受此操作(因为NSOutlineView,NSTextView等不处理给定的拖动操作).另外,我创建了一个自己的粘贴板数据类型,但这似乎没有必要.拥有自己的一个更清楚.
不幸的是,在我的NSImageView后代之外(在应用程序内部和外部)都没有给我NSDragOperationDelete draggedImage:endedAt:operation:(我在上面指定的内容)但NSDragOperationNone.此外,在应用程序外移动鼠标时的拖动光标是不允许的,而不是消失项目.所以,如果有人可以解决这两件事,我会接受它作为我的问题的答案.
MrA*_*sco -3
您可以使用以下命令使poof出现在鼠标位置:
NSShowAnimationEffect(NSAnimationEffectPoof, [NSEvent mouseLocation], NSZeroSize, NULL, NULL, NULL);
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅应用程序套件功能参考。
| 归档时间: |
|
| 查看次数: |
2372 次 |
| 最近记录: |