SwiftUI 以動畫形式呈現狀態變化。當 isExpanded 之類的值在 withAnimation(.spring) 中發生變化時,依賴它的每個視圖都會使用 spring 移動到新的佈局。
在 iOS 17 及更高版本中,描述彈簧最簡單的方法是使用兩個值:持續時間,即穩定所需的大致時間;以及彈跳,即超出的程度。彈跳為 0 可實現平滑運動,不會出現過衝;較高的值會增加彈跳力。 Apple 也提供預設:.smooth、.snappy 和 .bouncy。
較舊的程式碼使用 .spring(response:dampingFraction:)。反應與持續時間類似,阻尼分數為 1 表示沒有反彈,而較低的值會增加反彈。兩種形式都描述了相同的物理彈簧。
彈簧的一大優點是中斷。如果使用者再次點擊或拖曳手勢在動畫中結束,新的彈簧將從當前位置和速度開始,因此不會發生跳躍。對於拖曳手勢,當使用者釋放時傳遞手勢的速度,以便元素繼續沿著其拋出的方向移動。
如果相同元件還需要在 Web 或 Android 上運行,則將彈簧值保留為共用運動代幣會有所幫助。我們製作的 ExodeUI 具有 SwiftUI 運行時,因此帶有彈簧的設計組件可以在 SwiftUI 和其他平台上運行。