我已经定义了
import SwiftUI
import UniformTypeIdentifiers
enum LayerType: String, Codable, RawRepresentable {
case text
case image
}
struct TransferableLayer: Identifiable, Hashable, Codable, Transferable {
var id: UUID
var type: LayerType
init(id: UUID, type: LayerType) {
self.id = id
self.type = type
}
static var transferRepresentation: some TransferRepresentation {
CodableRepresentation(contentType: .transferableLayer)
}
}
extension UTType {
static let transferableLayer = UTType(exportedAs: "co.customUTType.transferableLayer")
}
我还有
LayersView
,我将 .draggable 属性分配给文本:
ForEach(Array(textLayers.enumerated()), id: \.element.id) { index, textLayer in
...
Text(textLayer.text)
.draggable(TransferableLayer(id: textLayer.id, type: LayerType.text))
...
}
我添加了 PanelView
.dropDestination(for: TransferableLayer.self) { droppedLayers, location in
print("I'm inside dropDestination")
}
当我将 textLayer 拖放到面板上时,dropDestination 中的 和
print()
代码不会调用。但它正确地显示了预览,并且我看到了我在那里所做的更改。
更新:
我在 SO 上搜索了类似的问题/答案,发现了这个: 在 macOS 的 Swiftui 中使用可传输协议拖放自定义类型
可传输协议及其如何与 MacOS 上的自定义类型配合使用似乎存在问题。顺便说一句,它可以作为 Mac Catalyst 在受支持的目标上运行
不确定这是否是一个可行的解决方法,但我发现在导出类型标识符中使用 public.text 而不是 com.public.data 似乎确实会产生影响(com.public.data 不会触发,但 public.text 会触发)触发 dropDestination)。