问题标签 [nsdraggingitem]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
macos - 如何在拖动中更改拖放的图像?
所以我想将一个对象从一个源拖到多个潜在目的地。当对象在每个目的地上方时,我希望它“变形”成不同的图像。从 NSDragSource 的角度来看,有没有一种简单的方法可以做到这一点?
cocoa - NSOutlineView 拖动图片
我想更改从基于视图和数据源的项目中拖动项目时使用的图像NSOutlineView
,但似乎找不到挂钩。我试过修改
在 rowViews、tableCellViews 和NSOutlineView
自身的子类中,但无济于事。
有谁知道默认图像(显然是从 tableCellView 的图像和文本字段中获取的)来自哪里?
objective-c - 用于拖动 vom NSTableView 的 NSDragOperation 为 -1
简单设置:
我有一个NSTableView
允许将项目拖到NSView
子类的方法。
在视图中,我正在通过NSDraggingInfo
's 方法检查拖动操作draggingSourceOperationMask
。
NSDragOperation
那里收到的水滴有-1。从视图开始的拖动具有预期的拖动操作(移动、复制,取决于具体情况)。但是表格视图中的拖动完全搞砸了。知道那里发生了什么..?
有什么我可以做的- (void)tableView:(NSTableView *)tableView draggingSession:(NSDraggingSession *)session willBeginAtPoint:(NSPoint)screenPoint forRowIndexes:(NSIndexSet *)rowIndexes
吗?
非常感谢任何提示。
macos - 避免使用 NSPasteboardItemDataProvider 阻塞 NSDraggingSession 中的主线程
在 Mac OS X 应用程序 (Cocoa) 中,我使用NSDraggingSession
. 使用NSDraggingItem
实现协议的对象,NSPasteboardItemDataProvider
在用户丢弃它时提供数据。
当我处理图像时,所涉及的类型是:NSPasteboardTypePNG
、、、和。这些图像位于远程位置,因此在将它们提供给粘贴板之前,我必须从 Internet 下载它们。kPasteboardTypeFileURLPromise
kUTTypeFileURL
com.adobe.photoshop-image
public.svg-image
我实现了- pasteboard(pasteboard:item:provideDataForType:)
这样的方法:
如果请求的类型是
kPasteboardTypeFileURLPromise
,我将获取粘贴位置,并在粘贴板中构建并设置 URL 字符串,其中包含将来应该写入文件的位置。如果请求的类型是
kUTTypeFileURL
,我下载文件,指定一个临时位置并将下载的文件写入该位置。然后,我在粘贴板中设置了该位置的 URL 字符串。如果请求的类型是其他类型之一,我下载文件并
NSData
在粘贴板中设置纯文本。
所有这些操作都在主线程上执行,产生了一些我想摆脱的滞后。
我尝试在后台线程上执行这些操作,然后返回主线程在粘贴板中设置最终数据,但这不起作用,因为该方法之前完成。
有谁知道实现它的方法?
swift - 想要在拖动时将其项目拖动到它所在的位置
我制作了自定义拖动图像并正在使用它。
一个问题是当我拖动项目项目的原点时变成一个空白区域。
我想将原始图像(?)留在原点。
所以我的收藏视图看起来什么也没发生。(当然,鼠标指针下有自定义图像正在拖动。)
请给我一个提示。
谢谢你。
文字很难解释所以我画了一张XD
更新 我的解决方案
- 继承 NSCollectionView 进行覆盖
func beginDraggingSession(with items: [NSDraggingItem], event: NSEvent, source: NSDraggingSource) -> NSDraggingSession
- 获取选定的 indexex
- 在循环选定的索引时,制作 NSDraggingItem 并替换来自方法的 arg 的项目,即索引处的内容。此时,如果您制作图像并使用
setDraggingFrame
拖动设置它,则鼠标指针下的图像将成为您的图像(我没有测试其他方式)并且collectionView将与拖动前一样。
更新 2
我再次阅读代码,发现解决方案实际上很简单。(但我认为这不是可推荐的解决方案......)
并且您需要自己计算需要删除和消失的项目。
swift - NSPasteboard 复制拖放文件
虽然我有工作代码,但我对我是否采取了正确的方法感到困惑,我正在寻求NSPasteboard
是否有人可以帮助我澄清最佳方法。
自 2012 年以来,Apple 似乎没有编写任何关于拖放的完整文档,并且在那个时候,您应该在其中实现它的方式(尤其是沙盒应用程序)似乎已经被弃用和改变。经过一番折腾,我发现当您访问它的路径属性时,拖动的粘贴板提供的文件 URL 显示了它的真实路径(而不是构成 url 的匿名数字字符串),这使得可以使用进行常规复制FileManager
.
我的问题是,我在这里遵循正确的程序吗?将从NSURL
粘贴板获得的内容转换为URL
类型并在其中使用它copyItem(at:URL, to:URL)
不起作用(即使将相同的 url 复制并粘贴到 Safari 中使我能够查看文件)。因此我改用copyItem(atPath:String, toPath:String)
. 为了进一步研究这一点,是否有URL
替换类型的方法NSURL(from:NSPasteboard)
?好像应该有。
无论如何,这是我正在工作的代码(请忽略 draggingEntered: 中的代码:目前,它只是让测试工作正常,而且我注册NSFilenamesPboardType
但随后忽略它的事实也可以被忽略)。
最后一点是,文档在注册拖动类型时一直提到使用 UTI,但我不清楚这会延伸多远。我应该用尿路感染代替NSURLPboardType
和吗?NSFilenamesPboardType