list - SwiftUI:列表中的动画圆圈

标签 list animation swiftui

我有以下代码,我用它来创建一个列表,每个元素中都有一个圆圈。

我的目标是在打开 View 时有一个“圆形填充动画”。在这种情况下,蓝色应填充到给定的百分比级别。圆圈和列表正在工作,但是当加载列表/用户访问 View 时我的动画没有启动。

知道我做错了什么吗?

struct CircleListView: View {
    
    @State var percentage: CGFloat = 75
    
    var body: some View {
        
        List {
            ForEach(1..<10) { element in
                ZStack {
                    TrackCircle()
                    ProgressCircle(percentage: percentage)
                }
            }
        }
    }
}

struct ProgressCircle: View {
    var percentage: CGFloat
    
    var body: some View {
        ZStack {
            Circle()
                .trim(from: 0, to: (percentage * 0.01))
                .stroke(style: StrokeStyle(lineWidth: 8, lineCap: .round, lineJoin: .round))
                .fill(Color.blue)
                .rotationEffect(.degrees(270))
                .animation(.spring(response: 2.0, dampingFraction: 1.0, blendDuration: 1.0))
        }
    }
}

struct TrackCircle: View {
    var body: some View {
        ZStack {
            Circle()
                .stroke(style: StrokeStyle(lineWidth: 8))
                .fill(Color.red)
        }
    }
}

非常感谢!

最佳答案

当检测到可动画属性发生变化时,动画就会开始。提供的代码是静态的 - 没有运行时更改,因此没有动画。

这里是修改后的演示,激事件画(使用 Xcode 12.1/iOS 14.1 测试)

@State var percentage: CGFloat = 0     // << initial state

var body: some View {
    
    List {
        ForEach(1..<10) { element in
            ZStack {
                TrackCircle()
                ProgressCircle(percentage: percentage)
            }
        }
    }
    .onAppear { percentage = 75 }     // << changed state
}

关于list - SwiftUI:列表中的动画圆圈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64988586/

相关文章:

python - 在 2 个 python 列表之间找到 "overlap"

python - 如何有条件地创建列表?

java - 在获取所有链接时,忽略循环中的注销链接并继续在 selenium java 中导航

angularjs - 多方向angularjs View 动画

ios - swift 中的按钮旋转动画制作类似的动画

python - 比较两个自定义列表python

jquery顺序动画

ios - 为什么 SwiftUI 的 ForEach 循环范围没有更新?

ios - FirebaseUI 和 SwiftUI 登录

swiftui - 是什么导致在此代码中调用 updateUIView()?