SwiftUI Gestures Composing Gestures
SwiftUI Gestures: Composing Gestures
Combine gestures using .simultaneousGesture or .highPriorityGesture and coordinate interactions.
Syntax
Compose: Add .simultaneousGesture() to run together, or .highPriorityGesture() to give precedence to one gesture.
Simultaneous Tap + Drag
Both gestures run: taps increment a counter while dragging changes color.
Example
import SwiftUI
struct ComposeSimultaneousDemo: View {
@State private var tapped = 0
@State private var dragged = false
var body: some View {
Rectangle()
.fill(dragged ? .orange : .purple)
.frame(height: 120)
.overlay(Text("taps: \(tapped)"))
.simultaneousGesture(TapGesture().onEnded { tapped += 1 })
.gesture(DragGesture().onChanged { _ in dragged = true }.onEnded { _ in dragged = false })
}
}
import SwiftUI
struct ContentView: View {
var body: some View { ComposeSimultaneousDemo() }
}
import SwiftUI
@main
struct MyApp: App {
var body: some Scene {
WindowGroup { ContentView() }
}
}
In the example above, both the tap and drag gestures run.
High Priority Drag Over Tap
Drag takes precedence over tap: while dragging, taps do not increment the counter.
Example
import SwiftUI
struct ComposePriorityDemo: View {
@State private var tapped = 0
@State private var dragging = false
var body: some View {
Rectangle()
.fill(dragging ? .orange : .purple)
.frame(height: 120)
.overlay(Text("taps: \(tapped)"))
.highPriorityGesture(DragGesture().onChanged { _ in dragging = true }.onEnded { _ in dragging = false })
.gesture(TapGesture().onEnded { if !dragging { tapped += 1 } })
}
}
import SwiftUI
struct ContentView: View {
var body: some View { ComposePriorityDemo() }
}
import SwiftUI
@main
struct MyApp: App {
var body: some Scene {
WindowGroup { ContentView() }
}
}
In the example above, the drag gesture takes precedence over the tap gesture.