SwiftUI Gestures Combined
Main Idea
Where things start to get more interesting is when gestures clash – when you have two or more gestures that might be recognized at the same time, such as if you have one gesture attached to a view and the same gesture attached to its parent.
// Child
struct ContentView: View {
var body: some View {
VStack {
Text("Hello, World!")
.onTapGesture {
print("Text tapped")
}
}
.onTapGesture {
print("VStack tapped")
}
}
}
// High Priority
struct ContentView: View {
var body: some View {
VStack {
Text("Hello World!")
.onTapGesture {
print("Text tapped")
}
}
.highPriorityGesture(
TapGesture()
.onEnded { _ in
print("VStack Tapped")
}
)
}
}
// Do Both
struct ContentView: View {
var body: some View {
VStack {
Text("Hello World!")
.onTapGesture {
print("Text tapped")
}
}
.simultaneousGesture(
TapGesture()
.onEnded { _ in
print("VStack Tapped")
}
)
}
}
// Sequenced
struct ContentView: View {
@State private var offset = CGSize.zero
@State private var isDragging = false
var body: some View {
let dragGesture = DragGesture()
.onChanged { value in offset = value.translation }
.onEnded {_ in
withAnimation {
offset = .zero
isDragging = false
}
}
let pressGesture = LongPressGesture()
.onEnded { value in
withAnimation {
isDragging = true
}
}
let combined = pressGesture.sequenced(before: dragGesture)
Circle()
.fill(.red)
.frame(width: 64, height: 64)
.scaleEffect(isDragging ? 1.5 : 1)
.offset(offset)
.gesture(combined)
}
}