SwiftUI | onDrag - 自定义 (dragItem) 预览图像外观
Posted
技术标签:
【中文标题】SwiftUI | onDrag - 自定义 (dragItem) 预览图像外观【英文标题】:SwiftUI | onDrag - customize (dragItem) preview image appearance 【发布时间】:2020-12-11 10:36:13 【问题描述】:我一直想知道是否有任何方法可以自定义使用onDrag
时被拖动的view
的preview image
?
如您所见,preview image
默认情况下是视图的不透明图像稍大。
根据我的发现,在拖动过程的最开始会生成一个preview image
。但我找不到改变它的方法。
我所说的自定义是指有一些自定义image
或自定义view
的preview 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
启动并返回NSItemProvider
和preview 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?