Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为SwiftUI中的旋转角度在CGAffineTransform上添加动画?_Swift_Swiftui_Cgaffinetransform - Fatal编程技术网

如何为SwiftUI中的旋转角度在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

我需要用旋转角度设置CGAffineTransform的动画,但我不知道是否可行,因为CGAffineTransform不符合可设置动画的格式。Maby用“withAnimation”,但我不知道如何使用它。我知道我可以使用rotationEffect,但对于一些理由,我必须使用CGAffineTransform

我的代码:

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自动设置角度变量。不用按任何按钮。我试过一些东西,但不管用。我不知道这是否可能?嗨,纪尧姆,这离题了。你可能应该发布一个新问题。如果您这样做了,请确保您发布了您尝试但不起作用的代码。