gpt4 book ai didi

ios - 在 SwiftUI 中的 ForEach 内将拖动手势添加到图像

转载 作者:行者123 更新时间:2023-12-01 15:46:48 25 4
gpt4 key购买 nike

我目前正在开发一个应用程序,向用户展示他的植物箱和一些测量值(如地面湿度、温度等)
每个植物箱里面都有一些植物,这些植物正在详细 View 中显示。我希望用户能够将其中一种植物拖到角落以将其移除。
目前我有这个实现:

@GestureState private var dragOffset = CGSize.zero

var body: some View {

//Plants Headline
VStack (spacing: 5) {
Text("Plants")
.font(.headline)
.fontWeight(.light)

//HStack for Plants Images
HStack (spacing: 10) {

//For each that loops through all of the plants inside the plant box
ForEach(plantBoxViewModel.plants) { plant in

//Image of the individual plant (obtained via http request to the backend)
Image(base64String: plant.picture)
.resizable()
.clipShape(Circle())
.overlay(Circle().stroke(Color.white, lineWidth: 2))
.offset(x: self.dragOffset.width, y: self.dragOffset.height)
.animation(.easeInOut)
.aspectRatio(contentMode: .fill)
.frame(width: 70, height: 70)
.gesture(
DragGesture()
.updating(self.$dragOffset, body: { (value, state, transaction) in
state = value.translation
})
)
}
}
}

}

它如下所示:
Screenshot of Code Snippet

但是,当我开始拖动时,两个图像都会移动。我认为这是因为两个图像的偏移量都绑定(bind)到同一个变量(DragOffset)。我怎样才能做到只有 1 个图像在移动?

我考虑过实现某种数组,将植物的索引映射到特定的偏移量,但我不知道如何将它实现到手势中。
谢谢你的帮助!

最佳答案

这是可能的方法 - 在拖动期间保持选择。使用 Xcode 11.4/iOS 13.4 测试。

demo

@GestureState private var dragOffset = CGSize.zero
@State private var selected: Plant? = nil // << your plant type here
var body: some View {

//Plants Headline
VStack (spacing: 5) {
Text("Plants")
.font(.headline)
.fontWeight(.light)

//HStack for Plants Images
HStack (spacing: 10) {

//For each that loops through all of the plants inside the plant box
ForEach(plantBoxViewModel.plants) { plant in

//Image of the individual plant (obtained via http request to the backend)
Image(base64String: plant.picture)
.resizable()
.clipShape(Circle())
.overlay(Circle().stroke(Color.white, lineWidth: 2))
.offset(x: self.selected == plant ? self.dragOffset.width : 0,
y: self.selected == plant ? self.dragOffset.height : 0)
.animation(.easeInOut)
.aspectRatio(contentMode: .fill)
.frame(width: 70, height: 70)
.gesture(
DragGesture()
.updating(self.$dragOffset, body: { (value, state, transaction) in
if nil == self.selected {
self.selected = plant
}
state = value.translation
}).onEnded { _ in self.selected = nil }
)
}
}
}

}

关于ios - 在 SwiftUI 中的 ForEach 内将拖动手势添加到图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61301505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com