因为你碰到了一个 SwiftUI 4 的 Bug 。
这个代码在 iOS 15 ( SwiftUI 3 )中运行时,下方面的 Text 是不会反复变化的。因为 Text 并不符合 Animatable 协议,无法创建差值。
在 SwiftUI 4 中,Text 在内部实现了对文字变化的动态处理,通过 contentTransition 可以设置差值的处理方式,目前看来,在 opactity 和 interpolate 这两种状态下,对 animation 为 repeatForever 或 repeatCount 的处理有问题,没有及时响应 animation 的停止。
仅此而已。建议你给苹果提交 FB,让他们在下个版本中改善该问题。
如果,你确实要实现这个效果,可以采用 @
jwautumn 回答中提到的方式,使用 if else 来创建两个不同的 Text 分支。
之所以在这种情况下,可以响应 animation ,是因为 transition 的原因。默认情况下,transition 为 opactity ,因此 SwiftUI 会为转场的透明度创建差值,反复在两个视图中交替。
需要注意的是,当 animation 为 repeat 时,状态( xv )并不会发生变化(只会在 toggle 执行时改变一次),所有的动画效果,都是在反应差值的状态,并非当前 xv 的状态。