highPriorityGesture()
强制一个手势先识别另一个手势?如果您在另一个视图中有一个 SwiftUI
视图,并且两个视图都具有相同的手势识别器,则系统将始终在父级之前在子级上触发识别器。 您可以使用 highPriorityGesture()
更改此行为,这将强制系统将一个手势优先于另一个手势。
例如,我们可以编写一些代码在 VStack
中放置一个圆圈,从而提供一个简单的轻击手势动作。 在这种情况下,圈子的手势动作将始终被触发:
struct ContentView: View {
var body: some View {
VStack {
Circle()
.fill(Color.red)
.frame(width: 200, height: 200)
.onTapGesture {
print("Circle tapped")
}
}
.onTapGesture {
print("VStack tapped")
}
}
}
如果要触发 VStack
手势代替圆的手势,则需要使用 highPriorityGesture()
替换 onTapGesture()
修饰符,如下所示:
struct ContentView: View {
var body: some View {
VStack {
Circle()
.fill(Color.red)
.frame(width: 200, height: 200)
.onTapGesture {
print("Circle tapped")
}
}
.highPriorityGesture(
TapGesture()
.onEnded { _ in
print("VStack tapped")
}
)
}
}
使用此替代方法时,将始终打印 VStack tapped
,因为 VStack
识别器将始终优先于圈子的优先级。