Если вы не можете использовать какой-либо из существующих анимируемых эффектов, вам нужно научить SwiftUI анимировать матрицу преобразования.Вы делаете это с GeometryEffect.Это протокол, который соответствует как Animatable, так и ViewModifier.
Если вы хотите получить полное объяснение того, как работает GeometryEffect, проверьте мой пост: https://swiftui -lab.com / swiftui-animations-part2 /
Вот рабочий пример:
struct ContentView: View {
@State private var animate = false
var body: some View {
Rectangle()
.frame(width: 50, height: 50)
.modifier(MyEffect(angle: animate ? .pi * 2 : 0))
.onTapGesture {
withAnimation(.easeInOut(duration: 2.0)) {
self.animate.toggle()
}
}
}
}
struct MyEffect: GeometryEffect {
var angle: CGFloat
var animatableData: CGFloat {
get { angle }
set { angle = newValue }
}
func effectValue(size: CGSize) -> ProjectionTransform {
return ProjectionTransform(CGAffineTransform(rotationAngle: angle))
}
}
Отвечая на ваши комментарии, вы можете использовать анимацию с любой переменной, а не только с логическим значением.Если переменная в конечном итоге влияет на анимируемый параметр, она будет анимирована.Вот пример:
struct ContentView: View {
@State private var angle: CGFloat = 0
var body: some View {
VStack {
Rectangle()
.frame(width: 50, height: 50)
.modifier(MyEffect(angle: angle))
Button("Go to 0") {
withAnimation(.easeInOut(duration: 2.0)) {
self.angle = 0
}
}
Button("Go to 360") {
withAnimation(.easeInOut(duration: 2.0)) {
self.angle = .pi * 2
}
}
}
}
}