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

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

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

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

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

有人有想法吗?

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

使用UIKit 可以自定义UIDragItem - 类似于使用previewProviderHere

这是我的演示代码:

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(_:) 修饰符生成的预览图像。我更想获得预览的参考,以便将其保存为图像,但我被卡住了。

标签: ios swift swiftui


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    • 2016-06-12
    • 2021-03-26
    • 2021-04-29
    • 2021-09-11
    • 1970-01-01
    相关资源
    最近更新 更多