offset - SwiftUI:手势和偏移未按预期工作

标签 offset gesture swiftui

我正在使用偏移量和手势修饰符在屏幕上移动一个圆圈。当我使用此代码时,一切都按预期工作:

import SwiftUI

struct MovingCircle: View {

@State private var dragged = CGSize.zero

var body: some View {
    Circle()
        .offset(x: self.dragged.width)
        .frame(width: 20, height: 20)
        .gesture(DragGesture()
            .onChanged{ value in
                self.dragged = value.translation
        }
        .onEnded{ value in
            self.dragged = CGSize.zero
            }
    )
 }
}

但是,我不想将圆圈重置为 onEnded 的原始位置。我希望它保持原位,然后在拖动时再次移动。当我使用以下代码时,我无法在重新拖动时再次移动圆圈并且它保持原位:
import SwiftUI

struct MovingCircle: View {

@State private var dragged = CGSize.zero

var body: some View {
    Circle()
        .offset(x: self.dragged.width)
        .frame(width: 20, height: 20)
        .gesture(DragGesture()
            .onChanged{ value in
                self.dragged = value.translation
        }
        .onEnded{ value in
            self.dragged = value.translation
            }
    )
}
}

这是什么原因,我是否遇到了一些错误或我编码不正确?

最佳答案

首先,要了解问题,添加.border(Color.red).frame()修饰符:

.frame(width: 20, height: 20).border(Color.red)

你会看到当点移动时,它的框架保持在原位。这就是为什么以后它不会响应手势的原因。 “可点击”区域不再与点匹配。并且因为内容区域现在是空的,它不再是“可点击的”。

要使框架随点移动,请颠倒顺序。 .offset()应该晚点来:

.frame(width: 20, height: 20).border(Color.red)
.offset(x: self.dragged.width)

最后,您会在每个 .onEnded() 之后看到,整个事情重置回来。解决它的一种方法是累积您在以前的手势中拖动的数量:

struct MovingCircle: View {

    @State private var dragged = CGSize.zero
    @State private var accumulated = CGSize.zero

    var body: some View {
        Circle()
            .frame(width: 20, height: 20).border(Color.red)
            .offset(x: self.dragged.width)

            .gesture(DragGesture()
                .onChanged{ value in
                    self.dragged = CGSize(width: value.translation.width + self.accumulated.width, height: value.translation.height + self.accumulated.height)
            }
            .onEnded{ value in
                self.dragged = CGSize(width: value.translation.width + self.accumulated.width, height: value.translation.height + self.accumulated.height)
                self.accumulated = self.dragged
                }
        )
    }
}

关于offset - SwiftUI:手势和偏移未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57488175/

相关文章:

mysql - 偏移量限制mysql查询

javascript - 当元素位于屏幕顶部时向元素添加类

javascript - 检测带有跳跃 Action 的滑动手势

c++ - 在 Windows 8.1 中查找触摸数字化仪的物理尺寸

ios - 如何使用 SwiftUI 扩展按钮的宽度

ios - 使用 DragGesture 调整 SwiftUI View 的框架会在所有维度上调整其大小

ios - SwiftUI iOS 14 Picker宽度无法更改

apache-spark - 结构化流的检查点周期多久一次,是否可配置?

excel - 查找单元格,粘贴并格式化时间值

delphi - 如何使用手势识别缩放方向(进/出)并应用缩放效果?