我需要使用rotationAngle为CGAffineTransform设置动画,但我不知道是否可行,因为CGAffineTransform不符合Animatable。 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)
    }
  }
}

#1楼 票数:1 已采纳

如果您不能使用任何现有的动画效果,则需要教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))
    }
}

响应您的评论,您可以将withAnimation与任何变量一起使用,而不仅是布尔值。 如果变量最终影响到可设置动画的参数,它将进行动画处理。 这是一个例子:

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
                }
            }
        }
    }
}

  ask by Guillaume translate from so

未解决问题?本站智能推荐:

1回复

如何使用CGAffineTransform将旋转角度的锚点更改为中心?

对于某些理由,在我的SwiftUI应用程序中,我需要使用带有CGAffineTransform和rotationAngle属性的transformEffect修饰符。 但是结果是这样的: 如何设置旋转角度的锚点到箭头图像的中心? 我在文档中看到可以使用CGPoint吗? 我
1回复

如何在动画过程中动态访问半径? (在CGAffineTransform期间可能)

我正在使用两个简单的CGAffineTransforms来上下缩放圆形UIView,但是我希望能够在动画发生时动态地在touchesBegan()中访问半径,并检查该半径是否等于某个值点。 困难在于我需要在动画仍在进行时检查半径。 我对CGAffineTransforms方法并不完全满意
1回复

不同动画块中的CGAffineTransform属性

我的目标是在动画中转换UIView。 问题在于,水平平移需要使用弹跳/弹跳动画进行动画处理,而垂直平移需要在不使用弹簧/弹跳动画的情况下进行动画处理。 以下代码将不起作用,因为第二个转换将替换第一个,但我想说明一下我想要实现的目标。 是否可以解决此问题而无需直接对视图框架进行动画处
2回复

CGAffineTransform无法在动画块内进行动画处理

我试图获得一个视图,以在它出现时增加它的比例(使用下面的loadResultsView()函数),但是每当我运行它时,都不会发生动画。 该视图最终以动画块中定义的结果状态结束。 我尝试使用框架值而不是视图上的约束,并且发生了同样的事情。 为什么会这样呢?
3回复

使用CGAffineTransform链接UIView动画缩放和转换比例

我正在尝试使用animate(withDuration:animations:)为Playground中的UIView animate(withDuration:animations:) 。 目标是向下移动视图,然后向右移动视图并同时放大视图。 所以我分两步来做,在第一个动画完成后调用第
1回复

单元格中的CGAffineTransform动画不起作用

我在CollectionViewCell内为UIImageView动画时遇到问题。 我已经使用“ Auto Layout设置了视图,不确定是否会导致问题。 如果尝试调用didEndDisplaying但没有结果。 调用单元动画的正确生命周期函数是什么? 码:
1回复

CGAffineTransform弄乱了ViewFrame

我有一个UIViewControllerAnimatedTransitioning ,其中动画之一是使用CGAffineTransform的缩放 toView.frame.origin.y = containerView.frame.size.height - toView.frame.hei
1回复

CGAffineTransform在其他视图上

我认为有九个子视图。 (topLeft,top,topRight,left,center,right,bottomLeft,bottom,bottomRight)。 当我在中央子视图中使用CGAffineTransform进行animation处理时。 这是一个棘手的问题。 中心上方