Повышение счета с помощью 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
                                }
                            })
        }
    }
}
→ Ссылка