如何为SwiftUI中的旋转角度在CGAffineTransform上添加动画?
我需要用旋转角度设置CGAffineTransform的动画,但我不知道是否可行,因为CGAffineTransform不符合可设置动画的格式。Maby用“withAnimation”,但我不知道如何使用它。我知道我可以使用rotationEffect,但对于一些理由,我必须使用CGAffineTransform 我的代码:如何为SwiftUI中的旋转角度在CGAffineTransform上添加动画?,swift,swiftui,cgaffinetransform,Swift,Swiftui,Cgaffinetransform,我需要用旋转角度设置CGAffineTransform的动画,但我不知道是否可行,因为CGAffineTransform不符合可设置动画的格式。Maby用“withAnimation”,但我不知道如何使用它。我知道我可以使用rotationEffect,但对于一些理由,我必须使用CGAffineTransform 我的代码: import SwiftUI import CoreLocation struct Arrow: View { var locationManager = CLLo
import SwiftUI
import CoreLocation
struct Arrow: View {
var locationManager = CLLocationManager()
@ObservedObject var location: LocationManager = LocationManager()
private var animationArrow: Animation {
Animation
.easeInOut(duration: 0.2)
}
var body: some View {
VStack {
Image("arrow")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 300, height: 300)
.transformEffect(
CGAffineTransform(translationX: -150, y: -150)
.concatenating(CGAffineTransform(rotationAngle: CGFloat(-location.heading.degreesToRadians)))
.concatenating(CGAffineTransform(translationX: 150, y: 150))
)
.animation(animationArrow)
Text(String(location.heading.degreesToRadians))
.font(.system(size: 20))
.fontWeight(.light)
.padding(.top, 15)
Text(String(location.coordinates[0]))
.font(.system(size: 20))
.fontWeight(.light)
.padding(.top, 15)
Text(String(location.coordinates[1]))
.font(.system(size: 20))
.fontWeight(.light)
.padding(.top, 15)
}
}
}
如果无法使用任何现有的可设置动画的效果,则需要教SwiftUI如何设置变换矩阵的动画。你可以用几何效应来做。它是一个协议,同时符合动画和视图修改器 如果您想了解GeometryEffect的工作原理,请查看我的帖子: 下面是一个工作示例:
struct ContentView:View{
@状态私有变量animate=false
var body:一些观点{
矩形()
.框架(宽度:50,高度:50)
.modifier(MyEffect(角度:动画?.pi*2:0))
.ontapsigne{
带动画(.easeInOut(持续时间:2.0)){
self.animate.toggle()
}
}
}
}
结构MyEffect:GeometryEffect{
变量角度:CGFloat
var animatableData:CGFloat{
获取{angle}
设置{angle=newValue}
}
func effectValue(大小:CGSize)->ProjectionTransform{
返回投影变换(CGAffineTransform(旋转角度:角度))
}
}
响应您的评论,您可以将withAnimation与任何变量一起使用,而不仅仅是布尔值。如果变量最终影响可设置动画的参数,则它将设置动画。下面是一个例子:
struct ContentView:View{
@国家私有变量角度:CGFloat=0
var body:一些观点{
VStack{
矩形()
.框架(宽度:50,高度:50)
.修改器(MyEffect(角度:角度))
按钮(“转到0”){
带动画(.easeInOut(持续时间:2.0)){
自转角=0
}
}
按钮(“转到360”){
带动画(.easeInOut(持续时间:2.0)){
self.angle=.pi*2
}
}
}
}
}
好的,我现在更明白了。但“withAnimation”只能用于布尔变量?您可以使用任何变量,而不仅仅是布尔变量。我在答案中添加了一个示例。好的,谢谢,再次抱歉,但现在我尝试使用location.heading自动设置角度变量。不用按任何按钮。我试过一些东西,但不管用。我不知道这是否可能?嗨,纪尧姆,这离题了。你可能应该发布一个新问题。如果您这样做了,请确保您发布了您尝试但不起作用的代码。