В приложении, над которым я работаю, есть часть, которая имеет, в основном, «навигацию вперед» - при нажатии на кнопки будет отображаться следующий слайд. Однако вторичная «обратная» навигация также необходима. Вот подход, который я использовал:
import SwiftUI
struct Sample: View {
@State private var dragOffset: CGFloat = -100
var body: some View {
VStack {
Text("Perhaps a title")
ScrollView {
VStack {
Text("Some scrollable content is going to be here")
// ...
Button(action: {
// Go to the next slide
}) { Text("Next") }
}
}
Text("and, maybe, something else")
}
.overlay(
Image(systemName: "arrow.left").offset(x: dragOffset / 2),
alignment: .leading
)
.gesture(
DragGesture()
.onChanged{
self.dragOffset = $0.translation.width
}
.onEnded {
self.dragOffset = -100 // Hide the arrow
if $0.translation.width > 100 {
// Go to the previous slide
}
}
)
}
}
Существует небольшой индикатор (стрелка влево), который изначально скрыт (dragOffset = -100). Когда начинается жест перетаскивания, смещение подается в переменную состояния dragOffset , которая фактически показывает стрелку. Когда жест перетаскивания заканчивается, стрелка снова скрывается и, если достигается определенное смещение, отображается предыдущий слайд.
Работает достаточно хорошо, за исключением того, что когда пользователь прокручивает содержимое в ScrollView, этот жест также запускается и обновляется на некоторое время, но затем, я полагаю, отменяется ScrollView, и onEnded не вызывается. В результате индикатор стрелки остается на экране.
Отсюда возникает вопрос: как правильно сделать такой жест, который бы работал вместе с ScrollView? Возможно ли это даже с текущим состоянием SwiftUI?