SwiftUI中.animation(_:,value:)为何影响其他属性的变化?
SwiftUI动画异常现象的原因分析
先明确SwiftUI动画的核心规则
.animation(_:value:) 不是给单个属性单独绑定动画,而是当绑定的value发生变化时,当前View及其子View中所有可动画属性的变化,都会套用这个动画规则完成过渡。如果多个动画修饰器共存,同一事务内的多属性变化会出现动画规则的共享或覆盖。
异常1:Animation1注释时,color随offset的动画速度变化
onAppear中同时修改了offset和color两个状态:
offset的变化触发了绑定它的Animation2,此时整个View树(包括Stick的颜色属性)的所有可动画属性变化都会使用Animation2的动画规则color没有绑定专属的动画修饰器,因此被纳入offset触发的动画事务中,跟着使用了Animation2的动画速度
异常2:取消Animation1注释后,offset使用了color的动画规则
onAppear同时触发offset和color的变化,两个动画(Animation1和Animation2)同时生效:
- Animation1是短周期的无限往复动画,优先级高于Animation2的长周期无限动画
- 同一事务内多动画冲突时,SwiftUI会优先采用更“持续活跃”的重复动画,导致依赖
offset的position属性动画被Animation1覆盖
异常3:修改progress时,offset动画中断但color动画继续
- 修改
progress会触发Animation3,此时整个View树的可动画属性都会套用Animation3的过渡动画,原有的Animation2(绑定offset)的无限重复动画会被新的动画事务中断(View重新计算body,旧动画上下文被重置) - 而color的动画是之前由
offset触发的独立无限动画,没有绑定到任何特定的value,因此不受后续progress变化的影响,会持续运行
内容的提问来源于stack exchange,提问作者richardjorne
相关产品推荐
相关产品推荐

