SwiftUI如何使用 simultaneousGesture() 同时识别两个手势?

18 min read

在 SwiftUI 中,可以使用 simultaneousGesture() 方法来同时识别两个手势。这个方法可以将多个手势绑定到同一个 view 上,然后让它们同时识别。

例如,我们可以创建一个拖动手势和一个缩放手势,并让它们同时作用于一个图片上,代码如下:

struct ContentView: View {
    @State private var scale: CGFloat = 1.0
    @State private var lastScaleValue: CGFloat = 1.0
    @State private var position = CGPoint(x: 0, y: 0)

    var body: some View {
        Image("swiftui_logo")
            .scaleEffect(scale)
            .position(position)
            .gesture(
                MagnificationGesture()
                    .onChanged { value in
                        self.scale = self.lastScaleValue * value.magnitude
                    }
                    .onEnded { value in
                        self.lastScaleValue = self.scale
                    }
                    .simultaneously(with: DragGesture()
                        .onChanged { value in
                            self.position = value.location
                        }
                    )
            )
    }
}

在这个例子中,我们创建了一个 MagnificationGesture 来实现缩放手势,并创建了一个 DragGesture 来实现拖动手势。然后,我们通过 simultaneousGesture() 方法将两个手势绑定到同一个 Image 的 gesture 上,让它们同时识别。

在 MagnificationGesture 的 onChanged 回调中,我们计算出当前的缩放比例,并将其应用于图片的 scaleEffect 中。在 onEnded 回调中,我们记录下最后一次的缩放比例。

在 DragGesture 的 onChanged 回调中,我们将图片的 position 设置为手指的位置。

通过 simultaneousGesture() 方法,我们实现了同时识别两个手势的效果。在图片上缩放和拖动时,两个手势同时生效,可以实现更自然的操作体验。