Анимация с задержкой вместо использования таймера - PullRequest
1 голос
/ 25 апреля 2020

У меня есть несколько кругов в swiftui, которые реагируют на прикосновение. Я хочу, чтобы они увеличили значение opa c и затем снова уменьшили его:

HStack {
   Spacer(minLength: 20.0)
   Circle()
      //#e74c3c
      .foregroundColor(Color(red: 231.0/255.0, green: 76.0/255.0, blue: 60.0/255.0, opacity: buttonOpac[buttonColor.red.rawValue]))
      .gesture(TapGesture()
         .onEnded({if self.buttonActive {
             self.buttonActive = false
             self.blink(buttonColor.red)
          } else {
             print("button inactive")
          }
       })) ...

метод blink оживляет изменение значения opa c:

func blink(_ buttonCol: buttonColor) {
        self.currentNumber += 1
        withAnimation(.easeOut(duration: blinkDuration)){
            self.buttonOpac[buttonCol.rawValue] = 1.0
        }
        withAnimation(Animation.easeIn(duration: blinkDuration).delay(blinkDuration)){
            self.buttonOpac[buttonCol.rawValue] = 0.5
        }
        withAnimation(Animation.linear.delay(2 * blinkDuration)){
            self.buttonActive = true
        }

    }

Для когда эта анимация активна, я хочу, чтобы круг был отключен и не реагировал на прикосновения. Я попытаюсь достичь этого с помощью @Status var buttonActive

. Это работает только до такой степени, что это значение устанавливается равным false при входе в блок .onEnded. Теперь я хочу сбросить его в методе blink после окончания других анимаций. Но модификатор задержки не работает для третьей «анимации». Фактически значение сразу же устанавливается обратно в true, чтобы круг продолжал реагировать на прикосновения.

Является ли единственный способ достичь цели без использования таймеров?

1 Ответ

0 голосов
/ 25 апреля 2020

Вот декларации:

enum buttonColor: Int { 
   case red 
   case blue 
   case green 
   case yellow } 

let blinkDuration = 0.5

@State private var buttonOpac: [Double] = [0.5, 0.5, 0.5, 0.5]
@State private var currentNumber = 0
...