【问题标题】:Simple SwiftUI Arc endAngle animation not working, only jump from one state to another简单的 SwiftUI Arc endAngle 动画不起作用,只能从一种状态跳转到另一种状态
【发布时间】:2020-04-14 20:47:02
【问题描述】:

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

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()
    }
}

我该如何解决?

【问题讨论】:

    标签: swift swiftui


    【解决方案1】:

    只需将动画数据添加到您的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
        }
    }
    

    【讨论】:

    • 谢谢。我将 endAngle 重命名为 animatableData 并且也可以工作:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    相关资源
    最近更新 更多