具有延迟的动画,而不是使用计时器

问题描述 投票:0回答:1

我在swiftui中有几个圆圈,它们对触摸手势有反应。我希望他们增加不透明度值,然后再降低它:

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")
          }
       })) ...

方法闪烁使不透明度值改变动画:

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

实现

这仅适用于在输入.onEnded块时将此值设置为false的情况。现在,我想在其他动画结束后以眨眼方法将其重置。但是延迟修饰符不适用于第三个“动画”。实际上,该值会立即设置为true,以便圆圈在触摸时继续做出反应。

是不使用计时器即可达到目标的唯一方法吗?

swiftui swiftui-animation
1个回答
0
投票

这里是声明:

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
© www.soinside.com 2019 - 2024. All rights reserved.