Animating gestures ジェスチャーのアニメーション
グラデーションカードをドラッグ!!
スムーズバージョン!!
import SwiftUI struct ContentView: View { @State private var dragAmount = CGSize.zero var body: some View { LinearGradient(gradient: Gradient(colors: [.yellow, .red]), startPoint: .topLeading, endPoint: .bottomTrailing) .frame(width: 300, height: 200) .clipShape(RoundedRectangle(cornerRadius: 10)) .animation(.spring()) .offset(dragAmount) .gesture( DragGesture() .onChanged { self.dragAmount = $0.translation } .onEnded { _ in self.dragAmount = .zero } /* .onEnded { _ in withAnimation(.spring()) { self.dragAmount = .zero } } */ ) } }
線形グラデーション
import SwiftUI struct ContentView: View { @State private var dragAmount = CGSize.zero var body: some View { LinearGradient(gradient: Gradient(colors: [.yellow, .red]), startPoint: .topLeading, endPoint: .bottomTrailing) .frame(width: 300, height: 200) .clipShape(RoundedRectangle(cornerRadius: 10)) //.animation(.spring()) .offset(dragAmount) .gesture( DragGesture() .onChanged { self.dragAmount = $0.translation } .onEnded { _ in self.dragAmount = .zero } .onEnded { _ in withAnimation(.spring()) { self.dragAmount = .zero } } ) } }
このコードを実行すると、文字をドラッグして文字列全体を追従させることができ、少し遅れて蛇のような効果が発生します。SwiftUIはドラッグを離すと色が変化し、文字が中央に戻ったときにも青と赤の間でアニメーション化します。
import SwiftUI struct ContentView: View { let letters = Array("Hello SwiftUI") @State private var enabled = false @State private var dragAmount = CGSize.zero var body: some View { HStack(spacing: 0) { ForEach(0..<letters.count) { num in Text(String(self.letters[num])) .padding(5) .font(.title) .background(self.enabled ? Color.blue : Color.red) .offset(self.dragAmount) .animation(Animation.default.delay(Double(num) / 20)) } } .gesture( DragGesture() .onChanged { self.dragAmount = $0.translation } .onEnded { _ in self.dragAmount = .zero self.enabled.toggle() } ) } }
遷移によるビューの表示と非表示
Showing and hiding views with transitions
import SwiftUI struct ContentView: View { @State private var isShowingRed = false var body: some View { VStack { Button("Tap Me") { withAnimation { self.isShowingRed.toggle() } } if isShowingRed { Rectangle() .fill(Color.red) .frame(width: 200, height: 200) //.transition(.scale) .transition(.asymmetric(insertion: .scale, removal: .opacity)) } } } }
ViewModifierを使用してカスタム遷移を構築する
Building custom transitions using ViewModifier
import SwiftUI struct ContentView: View { @State private var isShowingRed = false var body: some View { VStack { Button("Tap Me") { withAnimation { self.isShowingRed.toggle() } } if isShowingRed { Rectangle() .fill(Color.red) .frame(width: 200, height: 200) //.transition(.scale) //.transition(.asymmetric(insertion: .scale, removal: .opacity)) .transition(.pivot) } } } } struct CornerRotateModifier: ViewModifier { let amount: Double let anchor: UnitPoint func body(content: Content) -> some View { content.rotationEffect(.degrees(amount), anchor: anchor).clipped() } } extension AnyTransition { static var pivot: AnyTransition { .modifier( active: CornerRotateModifier(amount: -90, anchor: .topLeading), identity: CornerRotateModifier(amount: 0, anchor: .topLeading) ) } }