SwiftUI | onDrag - 自定义 (dragItem) 预览图像外观

Mof*_*waw 10 ios swift swiftui

我一直在想,如果有任何的方式来定制preview imageview所有正使用时拖onDrag

如您所见,preview image默认情况下,视图的不透明度图像稍大。

根据我的发现,preview image在拖动过程的一开始就生成了a 。但我找不到改变它的方法。

我所说的定制是指有一些定制imagepreview image定制view。(都没有默认的不透明度)

有没有人有想法?

我曾尝试使用previewImageHandler并且一般来说,阅读了很多关于NSItemProvider. 但对我来说,这似乎对 SwiftUI 来说是不可能的?

随着UIKit一个可能只是定制UIDragItem-类似的东西使用previewProvider这里

这是我的演示代码:

struct ContentView: View {
    
    var body: some View {
        DraggedView()
            .onDrag({ NSItemProvider() })
    }
    
    
    private struct DraggedView: View {
    
        var body: some View {
            RoundedRectangle(cornerRadius: 20)
                .frame(width: 120, height: 160)
                .foregroundColor(.green)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我将使用它在 a 中进行拖放LazyVGrid,因此gestures遗憾的是自定义没有选择。

我的第二个想法是同时有一个手势,首先item将要拖动的内容更改为其他内容,然后onDrag开始并返回NSItemProviderpreview image我想要的内容。但是我不能让这两个手势同时进行,你必须先关闭一个才能开始第二个。

谢谢!

Jor*_*n H 16

iOS 15 添加了一个 API 来执行此操作 - 您可以指定View要用于preview. onDrag(_:预览:)

RoundedRectangle(cornerRadius: 20)
    .frame(width: 120, height: 160)
    .foregroundColor(.green)
    .onDrag {
        NSItemProvider()
    } preview: {
        RoundedRectangle(cornerRadius: 18)
            .frame(width: 100, height: 140)
            .foregroundColor(.green)
    }
Run Code Online (Sandbox Code Playgroud)