首页 > 解决方案 > 简单的 SwiftUI Arc endAngle 动画不起作用,只能从一种状态跳转到另一种状态

问题描述

我正在尝试制作弧形外观的简单动画。这很简单,我不知道为什么不起作用。我做这个结构

struct Arc: Shape {
    var center: CGPoint
    var radius: CGFloat
    var endAngle: Double

    func path(in rect: CGRect) -> Path {
        var path = Path()

        path.addArc(center: center, radius: radius, startAngle: .degrees(180), endAngle: .degrees(endAngle), clockwise: false)

        return path
    }
}

然后像这样加载它

struct TestView: View {
    @State var endAngle: Double = 180

    var body: some View {
            Arc(center: CGPoint(x: 250, y: 250), radius: 100, endAngle: self.endAngle)
                .stroke(Color.orange, lineWidth: 5)
                .onAppear() {
                    withAnimation(Animation.linear(duration: 20)) {
                        self.endAngle = 0
                    }
            }
    }
}

但不是动画,只能从 180 跳到 0。我也尝试过 OnTapGesture,但也不起作用。我现在不知道,为什么这不起作用

我的 ContentView 很简单

struct ContentView: View {
    var body: some View {
      TestView()
    }
}

我该如何解决?

标签: swiftswiftui

解决方案


只需将动画数据添加到您的Arc,以指示应为哪个参数设置动画,如下所示

使用 Xcode 11.4 / iOS 13.4 测试

struct Arc: Shape {
    var center: CGPoint
    var radius: CGFloat
    var endAngle: Double

    var animatableData: CGFloat {     // << here !!
        get { CGFloat(endAngle) }
        set { endAngle = Double(newValue) }
    }

    func path(in rect: CGRect) -> Path {
        var path = Path()

        path.addArc(center: center, radius: radius, startAngle: .degrees(180), endAngle: .degrees(endAngle), clockwise: false)

        return path
    }
}

推荐阅读