SwiftUI DragGesture() 获取屏幕上的起始位置

use*_*301 3 swiftui draggesture

我想让一个视图“可滑动”,但是这个视图只覆盖整个屏幕的一小部分。正在做:

var body: some View {
    
    ZStack {
        Text("ABC")
            .gesture(DragGesture().onChanged(onChanged))
    }
}

func onChanged(value: DragGesture.Value) {
    print(value.startLocation)
    print("onChanged", value.location)
}
Run Code Online (Sandbox Code Playgroud)

为我提供用户滑动位置的相对值 - 但是,在不知道视图的确切位置的情况下,我无法知道用户的触摸在屏幕上的位置。

换句话说,当Text位于屏幕中央时,一直到右边缘给出 200px。但是假设文本向左移动,那么它几乎是 400。我尝试在 ZStack 上放置另一个手势来保存初始值,但是看来您不能在彼此之间拥有多个手势。

如何让侦听器转换值,使左边缘为 0,右边缘为以 px 为单位的 displayWidth,无论文本在哪里?

Geo*_*e_E 8

您可以利用坐标空间,并将其与 一起使用DragGesture

代码:

struct ContentView: View {
    @State private var location: CGPoint = .zero

    var body: some View {
        VStack(spacing: 30) {
            Text("ABC")
                .background(Color.red)
                .gesture(
                    DragGesture(coordinateSpace: .named("screen")).onChanged(onChanged)
                )

            Text("Location: (\(location.x), \(location.y))")
        }
        .frame(maxWidth: .infinity, maxHeight: .infinity)
        .coordinateSpace(name: "screen")
    }

    private func onChanged(value: DragGesture.Value) {
        location = value.location
    }
}
Run Code Online (Sandbox Code Playgroud)