SwiftUI 以动画形式呈现状态变化。当 isExpanded 之类的值在 withAnimation(.spring) 中发生变化时,依赖于它的每个视图都会使用 spring 移动到新的布局。
在 iOS 17 及更高版本中,描述弹簧的最简单方法是使用两个值:持续时间,即稳定所需的大致时间;以及弹跳,即超出的程度。弹跳为 0 可实现平滑运动,不会出现过冲;较高的值会增加弹跳力。 Apple 还提供预设:.smooth、.snappy 和 .bouncy。
较旧的代码使用 .spring(response:dampingFraction:)。响应与持续时间类似,阻尼分数为 1 意味着没有反弹,而较低的值会增加反弹。两种形式都描述了相同的物理弹簧。
弹簧的一大优点是中断。如果用户再次点击或拖动手势在动画中结束,新的弹簧将从当前位置和速度开始,因此不会发生跳跃。对于拖动手势,当用户释放时传递手势的速度,以便元素继续沿其抛出的方向移动。
如果同一组件还需要在 Web 或 Android 上运行,则将弹簧值保留为共享运动令牌会有所帮助。我们制作的 ExodeUI 具有 SwiftUI 运行时,因此带有弹簧的设计组件可以在 SwiftUI 和其他平台上运行。