在 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() 方法,我们实现了同时识别两个手势的效果。在图片上缩放和拖动时,两个手势同时生效,可以实现更自然的操作体验。