如何为两个偏移轴设置动画

发布于 2025-01-12 14:22:53 字数 775 浏览 1 评论 0原文

我如何独立地为两个 .offset() 轴设置动画?这看起来像一个错误,对吗?蓝色应该不断上下弹跳,但一旦我尝试为 x 偏移设置动画,y 动画就会停止。

@State var offsetX = 0.0
@State var offsetY = 0.0
var body: some View {
    VStack {
        Color.blue
            .frame(width: 50, height: 50)
            .offset(x: offsetX, y: offsetY)
            .onAppear {
                withAnimation(.easeInOut.repeatForever(autoreverses: true)) {
                    offsetY = 300
                }
                
                DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
                    withAnimation {
                        offsetX = 100
                    }
                }
            }
    }
}

How can i animate both .offset() axes independently? This looks like a bug right? The blue should keep bouncing up and down but the y animation stops once I try to animate the x offset.

@State var offsetX = 0.0
@State var offsetY = 0.0
var body: some View {
    VStack {
        Color.blue
            .frame(width: 50, height: 50)
            .offset(x: offsetX, y: offsetY)
            .onAppear {
                withAnimation(.easeInOut.repeatForever(autoreverses: true)) {
                    offsetY = 300
                }
                
                DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
                    withAnimation {
                        offsetX = 100
                    }
                }
            }
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

可是我不能没有你 2025-01-19 14:22:53

听起来有点矫枉过正,但我​​制作了一个自定义的 GeometryEffect,并且它独立地制作动画:

extension View {
  func independentOffset(x: CGFloat = 0, y: CGFloat = 0) -> some View {
    modifier(OffsetGeometryEffect(offset: CGPoint(x: x, y: y)))
  }
}

struct OffsetGeometryEffect: GeometryEffect {
  var offset: CGPoint
  
  var animatableData: CGPoint.AnimatableData {
    get { CGPoint.AnimatableData(offset.x, offset.y) }
    set { offset = CGPoint(x: newValue.first, y: newValue.second) }
  }
  
  func effectValue(size: CGSize) -> ProjectionTransform {
    return ProjectionTransform(CGAffineTransform(translationX: offset.x, y: offset.y))
  }
}

Sounds a bit overkill, but I made a custom GeometryEffect, and it animates independently:

extension View {
  func independentOffset(x: CGFloat = 0, y: CGFloat = 0) -> some View {
    modifier(OffsetGeometryEffect(offset: CGPoint(x: x, y: y)))
  }
}

struct OffsetGeometryEffect: GeometryEffect {
  var offset: CGPoint
  
  var animatableData: CGPoint.AnimatableData {
    get { CGPoint.AnimatableData(offset.x, offset.y) }
    set { offset = CGPoint(x: newValue.first, y: newValue.second) }
  }
  
  func effectValue(size: CGSize) -> ProjectionTransform {
    return ProjectionTransform(CGAffineTransform(translationX: offset.x, y: offset.y))
  }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文