考虑以下代码,为什么在滚动列表时停止不带有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()
}
}
答案 0 :(得分:1)
IMO,这是由于List
中的缓存/重用。对于List
,KeepRolling()
的所有值都相同,因此.onAppear
并不总是被调用。
如果要使每个这样的视图都唯一,请使用.id
,如下所示,所有方法都可用(已通过Xcode 11.2测试)
KeepRolling().id(UUID().uuidString)