SwiftUI 提供.animation()
了将动画更改为视图的绑定。但是,如果@Published
来自某个属性的@ObserveredObject
“自主”更改(例如,来自计时器),虽然视图将更新以响应更改,但没有明显的方法可以让视图为更改设置动画。
在下面的示例中,当isOn
从 Toggle 更改时,它会动画,但从 Toggle 更改时Timer
不会。有趣的是,如果我在这里使用三元条件而不是if
/else
甚至切换也不会触发动画。
struct ContentView: View {
@ObservedObject var model: Model
var body: some View {
VStack {
if model.isOn {
MyImage(color: .blue)
} else {
MyImage(color: .clear)
}
Spacer()
Toggle("switch", isOn: $model.isOn.animation(.easeIn(duration: 0.5)))
Spacer()
}
}
}
struct MyImage: View {
var color: Color
var body: some View {
Image(systemName: "pencil.circle.fill")
.resizable()
.frame(width: 100, height: 100)
.foregroundColor(color)
}
}
class Model: ObservableObject {
@Published var isOn: Bool = false
var timer = Timer()
init() {
timer = Timer.scheduledTimer(withTimeInterval: 5, repeats: true, block: { [unowned self] _ in
isOn.toggle()
})
}
}
当值更改不是来自绑定时,如何触发动画?