SwiftUI-滚动列表时视图中的动画停止

时间:2019-12-30 22:24:45

标签: list animation scroll swiftui

考虑以下代码,为什么在滚动列表时停止不带有n属性的视图中的动画?

在Xcode 11.3(11C29)上进行了测试,并在设备和模拟器上使用了新的默认项目。

import SwiftUI

struct ContentView: View {
    var body: some View {

        HStack {
            List(1...50, id: \.self) { n in
                HStack {
                    KeepRolling()
                    Spacer()
                    KeepRolling(n: n)
                }
            }
        }

    }
}

struct KeepRolling: View {

    @State var isAnimating = false

    var n: Int? = nil

    var body: some View {

        Rectangle()
            .frame(width: 50, height: 50)
            .rotationEffect(Angle(degrees: self.isAnimating ? 360 : 0))
            .onAppear {
                withAnimation(Animation.linear(duration: 2).repeatForever(autoreverses: false)) {
                    self.isAnimating = true
                }
            }

    }

}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

enter image description here

1 个答案:

答案 0 :(得分:1)

IMO,这是由于List中的缓存/重用。对于ListKeepRolling()的所有值都相同,因此.onAppear并不总是被调用。

如果要使每个这样的视图都唯一,请使用.id,如下所示,所有方法都可用(已通过Xcode 11.2测试)

KeepRolling().id(UUID().uuidString)