Swift 快捷方式拖动手势应用于父视图
我已经对Foreach视图中的图像视图应用了拖动手势,但当我拖动图像时,它会在视觉上拖动父视图中的所有图像,甚至在另一个Foreach视图中也会拖动图像。但是,应用于选定图像的操作可以正常工作。如何使选定的图像仅移动,而所有其他图像保持静止 手势变量:Swift 快捷方式拖动手势应用于父视图,swift,swiftui,gesture,drag,Swift,Swiftui,Gesture,Drag,我已经对Foreach视图中的图像视图应用了拖动手势,但当我拖动图像时,它会在视觉上拖动父视图中的所有图像,甚至在另一个Foreach视图中也会拖动图像。但是,应用于选定图像的操作可以正常工作。如何使选定的图像仅移动,而所有其他图像保持静止 手势变量: @State var position = CGSize.zero @GestureState private var dragOffset = CGSize.zero 代码如下: ScrollView(.horizontal) {
@State var position = CGSize.zero
@GestureState private var dragOffset = CGSize.zero
代码如下:
ScrollView(.horizontal) {
HStack(alignment: .center, spacing: 0) {
ForEach ((0..<player.playersCards.count), id: \.self) {number in
VStack {
Image(player.playersCards[number].pic)
.resizable()
.modifier(CardStyle())
.offset(dragOffset)
.gesture(
DragGesture()
.updating($dragOffset, body: { (value, state, transaction) in
state = value.translation
})
.onEnded({ (value) in
self.position.height += value.translation.height
self.position.width += value.translation.width
//player's turn
})
)
.animation(.spring())
Text("\(ai.getPower(card: player.playersCards[number]))")
.modifier(TextModifier())
}
}
}
}
ScrollView(.horizontal){
hs定位(对齐:。中心,间距:0){
对于每张((0..您必须为玩家卡定义数字,就像您定义的pic那样,它必须从0开始到您的最后一张卡,然后使用此向下代码进行拖动
ScrollView(.horizontal) {
HStack(alignment: .center, spacing: 0) {
ForEach ((0..<player.playersCards.count), id: \.self) {number in
VStack {
Image(player.playersCards[number].pic)
.resizable()
.modifier(CardStyle())
.offset(dragOffset)
.gesture(
DragGesture()
.updating($dragOffset, body: { (value, state, transaction) in
if player.playersCards[number].number == number { // <<: Here
state = value.translation
}
})
.onEnded({ (value) in
if player.playersCards[number].number == number { // <<: Here
self.position.height += value.translation.height
self.position.width += value.translation.width
}
//player's turn
})
)
.animation(.spring())
Text("\(ai.getPower(card: player.playersCards[number]))")
.modifier(TextModifier())
}
}
}
}
ScrollView(.horizontal){
hs定位(对齐:。中心,间距:0){
ForEach((0..这是因为ForEach
中的所有图像都设置为single@GestureState
属性,因此当拖动一张时,所有映射到它的图像都会在body刷新时被拖动。您可以使用单独的数组
,在特定索引处唯一地存储卡的每个拖动状态
struct LanguageView: View {
@State var position = CGSize.zero
@GestureState private var dragOffset:[CGSize]
init() {
let dragOffsets = [CGSize](repeating: CGSize.zero, count: 5) // Initialise with your model array count
_dragOffset = GestureState(wrappedValue: dragOffsets)
}
var body: some View {
ScrollView(.horizontal) {
HStack(alignment: .center, spacing: 5) {
ForEach ((0..<5)) {number in
VStack {
Image("ABC")
.resizable()
.frame(width: 300, height: 100)
//.modifier(CardStyle())
.offset(dragOffset[number])
.gesture(
DragGesture()
.updating($dragOffset, body: { (new, existing, transaction) in
existing[number] = new.translation
})
.onEnded({ (value) in
self.position.height += value.translation.height
self.position.width += value.translation.width
//player's turn
})
)
.animation(.spring())
Text("Foo")
// .modifier(TextModifier())
}
}
}
}.frame(width: 500, height: 100)
}
}
结构语言视图:视图{
@状态变量位置=CGSize.zero
@GestureState私有变量dragOffset:[CGSize]
init(){
让dragOffsets=[CGSize](重复:CGSize.zero,计数:5)//使用模型数组计数初始化
_dragOffset=GestureState(wrappedValue:dragOffset)
}
var body:一些观点{
滚动视图(.horizontal){
HStack(对齐:。中心,间距:5){
ForEach((0..非常感谢您的帮助。我现在唯一的问题是,卡在包含卡的HStack区域内移动,而不是在该区域内移动。您能告诉我如何使其在整个屏幕上或比父视图更大的区域上移动吗?