动画是第一次工作,但随后

时间:2020-03-23 18:49:11

标签: ios swift swiftui

尝试制作SwiftUI动画的动画。第一次可以完美运行,但是什么也不做。
self.pressed的开头为false。我将其设置为true,然后将其切换回false
我想按比例放大,然后在按下按钮时按比例缩小。

我在这里想念什么?

Button(action: {
    withAnimation(.linear(duration: 3)) {
        self.pressed = true
    }
    withAnimation(.linear(duration: 3)) {
        self.pressed = false
    }
}) {
    Wedge(startAngle: .init(degrees: 270), endAngle: .init(degrees: 360))
        .fill(Color.green)
        .frame(width: 200, height: 200)
        .offset(x: -100, y: 100)
        .scaleEffect(self.pressed ? 1.2 : 1.0)
}

基本上,当我按下它时,它将调整我的楔形形状的大小,但是下次我按下时它什么也没做。

我确实可以将其与DispatchQueue一起使用,但似乎很容易破解:

Button(action: {
    withAnimation(.linear(duration: 0.5)) {
        self.pressed = !self.pressed
    }
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
        withAnimation(.linear(duration: 0.5)) {
            self.pressed = !self.pressed
        }
    }
}) {
    Wedge(startAngle: .init(degrees: 180), endAngle: .init(degrees: 270))
        .fill(Color.red)
        .frame(width: 200, height: 200)
        .offset(x: 80, y: 80)
        .scaleEffect(self.pressed ? 1.2 : 1.0)
}

第二种方法是正确的方法吗?

-

这是楔子:

struct Wedge: Shape {
    let startAngle: Angle
    let endAngle: Angle

    func path(in rect: CGRect) -> Path {
        var path = Path()
        let center = CGPoint(x: rect.midX, y: rect.midY)
        path.addArc(center: center,
                    radius: min(rect.midX, rect.midY),
                    startAngle: startAngle,
                    endAngle: endAngle,
                    clockwise: false )
        path.addLine(to: center)
        path.closeSubpath()
        return path
    }
}

1 个答案:

答案 0 :(得分:1)

可能您想要这个

Button(action: {
    withAnimation(.linear(duration: 3)){
      self.pressed.toggle()               // << here !!
    }
    print("B")
    }) {
 ...