SwiftUI Animation 動畫效果

SwiftUI 讓製作流暢動畫變得前所未有的簡單。你不需要處理複雜的座標運算,只需要告訴 SwiftUI 「起始狀態」和「結束狀態」,它就會自動補間產生動畫。

隱式動畫 (Implicit Animation)

最簡單的方式是使用 .animation 修飾符。當綁定的數值改變時,View 的變化就會自動帶有動畫效果。

struct ContentView: View {
    @State private var scale = 1.0
    
    var body: some View {
        Button("縮放") {
            scale += 1
        }
        .scaleEffect(scale) // 綁定縮放比例
        .animation(.default, value: scale) // 當 scale 改變時,自動執行動畫
    }
}

顯式動畫 (Explicit Animation)

如果你只希望「這次修改」帶有動畫,可以使用 withAnimation 閉包。

Button("旋轉") {
    withAnimation(.spring()) { // 指定使用彈簧動畫效果
        rotation += 90
    }
}

轉場效果 (Transition)

當一個 View 出現或消失時,我們可以定義它的進場/退場方式。

if showDetails {
    Text("詳細資訊")
        .transition(.slide) // 滑動進場
        // 也可以組合: .transition(.opacity.combined(with: .scale))
}
轉場動畫通常需要配合 withAnimation 使用,否則 View 會瞬間切換。

MatchedGeometryEffect (神奇移動)

這是 SwiftUI 最酷炫的效果之一,讓兩個完全不同的 View 在切換時,看起來像是同一個元素飛過去。常用於 Hero Animation (Hero 轉場)。

@Namespace var animation // 定義動畫命名空間

// 視圖 A
Image("avatar")
    .matchedGeometryEffect(id: "avatar", in: animation)

// 視圖 B (在別的地方)
Image("avatar")
    .matchedGeometryEffect(id: "avatar", in: animation)

掌握動畫能大幅提升 App 的質感,讓使用者體驗更加愉悅。