ترکیب ژست ها (Composing Gestures)
اینجا «ترکیب ژست ها» را یاد می گیریم. «ژست (Gesture)» یعنی حرکت لمسی، مثل ضربه و کشیدن. با ترکیب، چند ژست باهم کار می کنند یا یکی اولویت می گیرد.
ترکیب ژست ها چیست؟
با .simultaneousGesture دو ژست همزمان اجرا می شوند. با .highPriorityGesture یکی جلوتر عمل می کند و بقیه را پیشی می گیرد.
اجرای همزمان ضربه و کشیدن
در این نمونه، هر ضربه شمارنده را زیاد می کند و کشیدن رنگ را عوض می کند. هر دو باهم کار می کنند.
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
}
)
}
}
struct ContentView: View {
var body: some View {
ComposeSimultaneousDemo()
}
}
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
نکته: اگر ژست ها تداخل دارند، رویدادها را ساده نگه دار. سپس منطق را مرحله ای بساز.
اولویت دادن به کشیدن روی ضربه
اینجا کشیدن، جلوتر از ضربه اجرا می شود. وقتی در حال کشیدن هستی، ضربه شمرده نمی شود.
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
}
}
)
}
}
struct ContentView: View {
var body: some View {
ComposePriorityDemo()
}
}
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
گام های عملی
- ژست اصلی را روی نما بگذار.
- ژست دوم را با
.simultaneousGestureیا.highPriorityGestureاضافه کن. - منطق تداخل را ساده و قابل فهم نگه دار.
هشدار: ژست های زیاد می توانند پیمایش را خراب کنند. در موبایل تعادل مهم است.
برای ضربه ساده به TapGesture برو. برای جابه جایی نما، DragGesture را ببین. مرور کلی هم در ژست ها در SwiftUI است.
جمع بندی سریع
- simultaneousGesture اجرای همزمان می دهد.
- highPriorityGesture اولویت می دهد.
- تداخل را با حالت ها کنترل کن.
- در موبایل ساده سازی کن.