如何在macOS上使用SwiftUI设置拖动图片?

4

我试图为GridView更改拖放的预览图像,而该默认值似乎包括网格中所有可见项。

据我理解,我应该能够设置NSItemProvider.previewImageHandler块以自定义使用的图像。

我似乎找不到任何示例展示这样一个块的外观,以返回自定义的图像。是否有人可以提供返回Image的此类块的示例?

此外,是否还需要在NSItemProvider上调用loadPreviewImage()方法-我认为不需要,macOS会自动执行此操作。

这是我目前的代码,但是该预览处理程序未被调用。

.onDrag {
    let itemProvider = NSItemProvider(object: fileService )
    itemProvider.previewImageHandler = {completion, expectedClass, options in
        os_log("previewImageHandler called")
        let image = NSImage(named: "film")
        if let data = image?.tiffRepresentation {
            completion?(data as NSSecureCoding, nil)
        } else {
            let error = NSError(domain:"", code:001, userInfo:[ NSLocalizedDescriptionKey: "Unable to create preview image"])
            completion?(nil, error)
        }
    }
    return itemProvider
}
1个回答

1
在MacOS 12和iOS 15中,onDrag修饰符具有一个初始化程序,其中包含一个preview,该preview接受一个ViewBuilder闭包来提供预览图像。

以下是一个示例。

.onDrag({
    let itemProvider = NSItemProvider(object: fileService )
    itemProvider.previewImageHandler = {completion, expectedClass, options in
        os_log("previewImageHandler called")
        let image = NSImage(named: "film")
        if let data = image?.tiffRepresentation {
            completion?(data as NSSecureCoding, nil)
        } else {
            let error = NSError(domain:"", code:001, userInfo:[ NSLocalizedDescriptionKey: "Unable to create preview image"])
            completion?(nil, error)
        }
    }
    return itemProvider

}, preview: {
    Image("myImage")
        .resizable()
        .aspectRatio(contentMode: .fit)
        .frame(width: 64, height: 64)
        .foregroundColor(.teal)
        .padding()
})

1
请注意,此初始化程序仅适用于 macOS 12 和 iOS 15 或更高版本。以下是文档链接:https://developer.apple.com/documentation/swiftui/path/ondrag(_:preview:) - alobaili
@alobaili 很好的建议,我会更新答案。谢谢。 - Chris
是我还是新的“预览”有问题?当我的视图被重绘时,预览没有得到更新,仍然显示我第一次拖动的图像。 - godbout

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接