Использование одновременно LongPressGesture и прокрутки внутри ScrollView в SwiftUI

В SwiftUI, использование одновременно LongPressGesture
и прокрутки внутри ScrollView
может быть сложной задачей, так как ScrollView
захватывает жесты прокрутки и может блокировать распознавание долгого нажатия. Чтобы оба эти элемента работали вместе, можно использовать комбинацию модификаторов жестов и приоритетов.
Вот подход, который позволит обработать оба действия:
import SwiftUI
struct ContentView: View {
@State private var isLongPressed = false
var body: some View {
ScrollView {
VStack(spacing: 20) {
ForEach(0..<50) { i in
Text("Элемент \(i)")
.padding()
.background(isLongPressed ? Color.red : Color.blue)
.cornerRadius(8)
.onLongPressGesture {
isLongPressed.toggle()
}
}
}
}
.gesture(
LongPressGesture(minimumDuration: 1.0)
.onEnded { _ in
// Логика при долгом нажатии
isLongPressed.toggle()
}
.simultaneously(with: DragGesture())
)
}
}
Основные моменты:
-
Одновременные жесты: Модификатор
.simultaneously(with:)
используется для того, чтобы разрешить работу как жеста долгого нажатия (LongPressGesture
), так и жеста прокрутки (DragGesture
), который отвечает за скроллинг вScrollView
. -
DragGesture для прокрутки: Включение
DragGesture
гарантирует, что поведение прокруткиScrollView
не будет блокировано при долгом нажатии.
Таким образом, можно обрабатывать как жесты долгого нажатия, так и плавную прокрутку внутри ScrollView
.