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

Posted

技术标签:

【中文标题】SwiftUI | onDrag - 自定义 (dragItem) 预览图像外观【英文标题】:SwiftUI | onDrag - customize (dragItem) preview image appearance 【发布时间】:2020-12-11 10:36:13 【问题描述】:

我一直想知道是否有任何方法可以自定义使用onDrag 时被拖动的viewpreview image

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

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

我所说的自定义是指有一些自定义image 或自定义viewpreview image。 (都没有默认的不透明度)

有人有想法吗?

我尝试过使用previewImageHandler,总的来说,阅读了很多关于NSItemProvider 的信息。但对我来说,这似乎是 SwiftUI 不可能做到的事情?

使用UIKit 可以自定义UIDragItem - 类似于使用previewProvider:Here

这是我的演示代码:

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)
        
    

我将使用它在LazyVGrid 中进行拖放,因此很遗憾无法自定义gestures

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

谢谢!

【问题讨论】:

明确记载:“应用onDrag(_:)修饰符会为该视图添加适当的拖放手势。当拖动操作开始时,会生成并使用该视图的渲染作为预览图像。” 所以没有办法自定义这个?或者有什么解决方法? 为什么不呢?从头开始,从 LongPressGesture 和 DragGesture 的低级别开始,以及其他所有手动操作...很长的路要走,但可能。 我试过这个但失败了,这对我来说太多了,因为要考虑的事情太多了,我认为这不如苹果 onDrag,onDrop。 来自我很长的搜索。无法控制为 onDrag(_:) 修饰符生成的预览图像。我更想获得预览的参考,以便将其保存为图像,但我被卡住了。 【参考方案1】:

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

RoundedRectangle(cornerRadius: 20)
    .frame(width: 120, height: 160)
    .foregroundColor(.green)
    .onDrag 
        NSItemProvider()
     preview: 
        RoundedRectangle(cornerRadius: 18)
            .frame(width: 100, height: 140)
            .foregroundColor(.green)
    

【讨论】:

以上是关于SwiftUI | onDrag - 自定义 (dragItem) 预览图像外观的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI onDrag。如何提供多个 NSItemProviders?

SwiftUI onDrag 在设备上运行时不显示预览图像

SwiftUI 在自定义 TextField 上切换活动/非活动线条颜色

SwiftUI 从一个列表拖到另一个列表

SwiftUI-自定义容器

SwiftUI:自定义SearchBar