在 SwiftUI 中修改 ForEach 内的视图
Posted
技术标签:
【中文标题】在 SwiftUI 中修改 ForEach 内的视图【英文标题】:Modify view inside a ForEach in SwiftUI 【发布时间】:2021-02-15 22:03:23 【问题描述】:我尝试更新 ForEach 的一项的位置。我只想从 ForEach 的数组中拖出一个项目。其余的应该保持不变。我尝试了几种不同的方法,结果总是所有项目都被拖动或根本没有项目。
在这个阶段我真的很沮丧,所以如果你能帮助我,我会非常高兴!如果您需要更多信息,请随时询问,我是 *** 的新手。
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
)
【问题讨论】:
这是否回答了您的问题***.com/a/61301670/12299030? 【参考方案1】: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
都有自己的位置属性。
【讨论】:
非常感谢!【参考方案2】:您正在更改值position
,这两个视图的使用方式相同。
如果您希望每个视图独立移动,或者以其他方式分别跟踪它们的位置,您将需要一个单独的 @State 变量。
【讨论】:
以上是关于在 SwiftUI 中修改 ForEach 内的视图的主要内容,如果未能解决你的问题,请参考以下文章
iOS SwiftUI 中 ForEach 内的 if 语句
SwiftUI:VStack 中 ForEach 中的 HStack 使多行文本重叠