macOS 13.1 SwiftUI无法用.onDrag/.draggable将图片拖至桌面/访达
解决SwiftUI macOS应用内图片拖拽到桌面/访达的问题
你的核心问题是没有给访达提供可识别为文件的明确格式数据,原代码用TIFF数据和通用类型标识的组合,无法被访达正确解析为可保存的图片文件。以下是修复方案:
完整代码示例
首先需要给NSImage添加扩展,用来将图片转换为PNG格式数据(访达对PNG/JPEG这类常见格式支持更好):
import SwiftUI import UniformTypeIdentifiers extension NSImage { func pngData() -> Data? { guard let tiffRepresentation = self.tiffRepresentation, let bitmapImage = NSBitmapImageRep(data: tiffRepresentation) else { return nil } return bitmapImage.representation(using: .png, properties: [:]) } } struct ContentView: View { @State var image: NSImage = NSImage(imageLiteralResourceName: "demoImage") var body: some View { Image(nsImage: image) .resizable() .scaledToFit() .frame(width: 200, height: 200) .onDrag { guard let pngData = image.pngData() else { return NSItemProvider() } // 方式1:直接生成可拖拽的PNG数据 return NSItemProvider(data: pngData, typeIdentifier: UTType.png.identifier) // 方式2:指定拖拽后的文件名(取消注释即可使用) // let fileWrapper = NSFileWrapper(regularFileWithContents: pngData) // fileWrapper.preferredFilename = "my_exported_image.png" // return NSItemProvider(item: fileWrapper, typeIdentifier: UTType.png.identifier) } } }
关键修复点
转换为常见图片格式:
放弃TIFF格式,转为PNG(或JPEG)数据,访达能直接识别这类格式并保存为可预览的图片文件。使用正确的UTType:
用UTType.png.identifier替代通用的UTType.image或UTType.tiff,给访达明确的文件类型标识,确保它知道如何处理拖拽的数据。自定义NSItemProvider:
通过NSItemProvider(data:typeIdentifier:)直接传入二进制数据,或者用NSFileWrapper指定文件名,满足访达对文件拖拽的要求——原代码中直接传入tiffRepresentation作为NSSecureCoding?的方式,无法被访达解析为可保存的文件。
内容的提问来源于stack exchange,提问作者Yiming Designer
相关产品推荐
相关产品推荐

