在 SwiftUI 中修改 ForEach 内的视图
Modify view inside a ForEach in SwiftUI
我试图更新 ForEach 中一项的位置。我只想从 ForEach 的数组中拖出一项。其余的应该保持不变。我尝试了几种不同的方法,结果总是所有项目都被拖动或根本没有项目。
现阶段我真的很沮丧,如果你能帮助我,我会很高兴!如果您需要更多信息,请随时询问,我是 Whosebug 的新人。
struct ContentView: View {
var texts: [String] = ["Test1", "Test2"]
@State var positon: CGSize = .zero
var body: some View {
HStack {
ForEach(texts, id: \.self) { text in
Text(text)
.offset(y: positon.height)
.gesture(
DragGesture()
.onChanged { value in
positon = value.translation
}
.onEnded { value in
positon = .zero
}
)
}
}
}
}
两个 Text
视图同时被拖动,因为两个 Text
视图
offset(y: ...)
取决于相同的 position
变量。
像这样的东西应该可以工作:
struct ContentView: View {
var texts: [String] = ["Test1", "Test2"]
var body: some View {
HStack {
ForEach(texts, id: \.self) { text in
DraggableText(text: text)
}
}
}
}
struct DraggableText: View {
var text: String
@GestureState var position: CGSize = .zero
var body: some View {
Text(text)
.offset(y: position.height)
.gesture(
DragGesture().updating($position, body: { value, state, transaction in
state = value.translation
})
)
}
}
每个DraggableText
都有自己的位置属性。
您正在更改值 position
,这两个视图的使用方式相同。
如果您希望每个视图独立移动,或者通过其他方式分别跟踪它们的位置,则需要为每个视图单独设置一个@State 变量。
我试图更新 ForEach 中一项的位置。我只想从 ForEach 的数组中拖出一项。其余的应该保持不变。我尝试了几种不同的方法,结果总是所有项目都被拖动或根本没有项目。
现阶段我真的很沮丧,如果你能帮助我,我会很高兴!如果您需要更多信息,请随时询问,我是 Whosebug 的新人。
struct ContentView: View {
var texts: [String] = ["Test1", "Test2"]
@State var positon: CGSize = .zero
var body: some View {
HStack {
ForEach(texts, id: \.self) { text in
Text(text)
.offset(y: positon.height)
.gesture(
DragGesture()
.onChanged { value in
positon = value.translation
}
.onEnded { value in
positon = .zero
}
)
}
}
}
}
两个 Text
视图同时被拖动,因为两个 Text
视图
offset(y: ...)
取决于相同的 position
变量。
像这样的东西应该可以工作:
struct ContentView: View {
var texts: [String] = ["Test1", "Test2"]
var body: some View {
HStack {
ForEach(texts, id: \.self) { text in
DraggableText(text: text)
}
}
}
}
struct DraggableText: View {
var text: String
@GestureState var position: CGSize = .zero
var body: some View {
Text(text)
.offset(y: position.height)
.gesture(
DragGesture().updating($position, body: { value, state, transaction in
state = value.translation
})
)
}
}
每个DraggableText
都有自己的位置属性。
您正在更改值 position
,这两个视图的使用方式相同。
如果您希望每个视图独立移动,或者通过其他方式分别跟踪它们的位置,则需要为每个视图单独设置一个@State 变量。