You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)
            }
    }
}

关键修复点

  1. 转换为常见图片格式:
    放弃TIFF格式,转为PNG(或JPEG)数据,访达能直接识别这类格式并保存为可预览的图片文件。

  2. 使用正确的UTType:
    用UTType.png.identifier替代通用的UTType.image或UTType.tiff,给访达明确的文件类型标识,确保它知道如何处理拖拽的数据。

  3. 自定义NSItemProvider:
    通过NSItemProvider(data:typeIdentifier:)直接传入二进制数据,或者用NSFileWrapper指定文件名,满足访达对文件拖拽的要求——原代码中直接传入tiffRepresentation作为NSSecureCoding?的方式,无法被访达解析为可保存的文件。

内容的提问来源于stack exchange,提问作者Yiming Designer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 08:05:38