Повышение счета с помощью DragGesture и фигуры
Подскажите пожалуйста, можно ли как то увеличить/уменьшить счетчик, при использовании DragGesture, вот код:
struct ContentView: View {
@State private var count: Int = 0
@State private var offset: CGSize = .zero
var body: some View {
VStack(spacing: 15) {
Text("\(count)")
RoundedRectangle(cornerRadius: 10)
.frame(width: 250, height: 350)
.foregroundColor(.white)
.shadow(color: .black, radius: 10)
.offset(x: offset.width)
.gesture(DragGesture()
.onChanged { value in
withAnimation(.spring()) {
offset = value.translation
if offset.width > 150 {
count += 1
} else if offset.width < -150 {
count -= 1
}
}
}
.onEnded { value in
withAnimation(.spring()) {
offset = .zero
}
})
}
}
}
Проблема в том, что счетчик постоянно повышается/уменьшается после преодоления установленных в условиях координат по оси x, а задумка в том, чтоб он повысился/понизился на единицу и фигура вернулась в начальное местоположение, добавление следующего кода так же не помогло:
.onChanged { value in
withAnimation(.spring()) {
offset = value.translation
if offset.width > 150 {
count += 1
offset = .zero
} else if offset.width < -150 {
count -= 1
offset = .zero
}
}
}
Подскажите пожалуйста, как можно выполнить данную задумку.
Ответы (1 шт):
Автор решения: schmidt9
→ Ссылка
Вы можете добавить флаг, который будет указывать на пересечение границы диапазона, чтобы контролировать счетчик
struct ContentView: View {
@State private var count: Int = 0
@State private var offset: CGSize = .zero
@State private var isThresholdPassed = false // -- 1
var body: some View {
VStack(spacing: 15) {
Text("\(count)")
RoundedRectangle(cornerRadius: 10)
.frame(width: 250, height: 350)
.foregroundColor(.white)
.shadow(color: .black, radius: 10)
.offset(x: offset.width)
.gesture(DragGesture()
.onChanged { value in
withAnimation(.spring()) {
offset = value.translation
if !isThresholdPassed { // -- 2
if offset.width > 150 {
count += 1
isThresholdPassed = true
} else if offset.width < -150 {
count -= 1
isThresholdPassed = true
}
}
}
}
.onEnded { value in
withAnimation(.spring()) {
isThresholdPassed = false // -- 3
offset = .zero
}
})
}
}
}