Проблема с анимацией при отмене длительного нажатия - SwiftUI, iOS 14.5

Я все еще изучаю и пытаюсь понять все тонкости swiftUI. В настоящее время я сосредотачиваюсь на понимании жестов и анимации, и вот проблема, которая кажется неразрешимой на моем уровне опыта:

Проблема: я испытываю неожиданное поведение, если longPressGesture отменяется, например. поднятие пальца до того, как будет превышена минимальная длительность длительного нажатия.

Ожидаемый результат: в приведенном выше примере вы видите, как я долгое нажатие 2 раза и потом один раз отменяю долгое нажатие. Я бы ожидал, что красный индикатор выполнения снова уменьшится и сохранит свое положение в центре, если longPress было отменено. Но, как видите, индикатор выполнения меняет свое положение.

Что вызывает эту проблему и как ее решить при использовании swiftUI и GestureState

Вот код:

      
struct DiamondPress: View {
    
    @GestureState var isDetectingLongPress = false
    @State var completedLongPress = false
    
    var longPress: some Gesture {
        LongPressGesture(minimumDuration: 2)
        .updating($isDetectingLongPress) { currentState, gestureState, transaction in
            gestureState = currentState
            transaction.animation = Animation.linear(duration: 2.0)
        }
        .onEnded { _ in
            self.completedLongPress.toggle()
        }
    }

    var body: some View {
        
        ZStack {           
            Color.offWhite
            
            RoundedRectangle(cornerRadius: 12, style: .continuous)
            .frame(width: 100, height: 100, alignment: .center)
            .foregroundColor(.white)
            .scaleEffect(completedLongPress ? 2.0 : 1.0)
            .gesture(longPress)
            .animation(.easeIn(duration: 0.2))
                
            // here is the red progress bar:
            Rectangle()
            .frame(
               width: !isDetectingLongPress ? CGFloat(5) : CGFloat(100),
               height: 5, alignment: .center
            )
            .foregroundColor(.red)
        }
        .edgesIgnoringSafeArea(.all)
    }
}

Большое спасибо, любая помощь или подсказка приветствуются.

0 ответов

Другие вопросы по тегам