在 SwiftUI 中围绕圆圈旋转图像,使图像在屏幕上保持直立

Rotating images around a circle in SwiftUI, keep images upright on screen

提问人:dramadom 提问时间:11/17/2023 更新时间:11/17/2023 访问量:25

问:

我有 3 张图片,都在一个圆圈的不同位置。我希望图像以顺时针方向绕圆圈旋转,同时在绕圆圈的整个旅程中保持直立在屏幕上。在下面的代码中,它们沿顺时针方向移动,但当它们相对于屏幕在周边移动时不会保持直立。它们相对于圆的中间在圆圈周围保持直立。

有谁知道如何确保图像相对于屏幕保持直立?此外,如果有人建议尝试反向旋转,请尝试在我的旋转角度变量中添加一个“-”符号,您会看到它只是逆时针移动。

谢谢,这是我的代码:

import SwiftUI

struct AnotherCircleTry: View {
    @State private var rotationAngle = 0.0

    var body: some View {
        VStack {
            Spacer()
            Text("Rotating images!")
            Spacer()

            ZStack {
                Circle()
                    .stroke()
                    .frame(width: 250, height: 250)
                    .hidden()

                // Image 1
                Image("image-1")
                    .resizable()
                    .frame(width: 50, height: 50)
                    .clipShape(Circle())
                    .offset(x: cos(CGFloat(rotationAngle) / 180.0 * .pi) * 100,
                            y: sin(CGFloat(rotationAngle) / 180.0 * .pi) * 100)
                    .rotationEffect(.degrees(rotationAngle), anchor: .center)

                // Image 2
                Image("image-2")
                    .resizable()
                    .frame(width: 50, height: 50)
                    .clipShape(Circle())
                    .offset(x: cos(CGFloat(rotationAngle) / 180.0 * .pi) * 100,
                            y: sin(CGFloat(rotationAngle) / 180.0 * .pi) * 100)
                    .rotationEffect(.degrees((rotationAngle + 120)), anchor: .center)

                // Image 3
                Image("image-3")
                    .resizable()
                    .frame(width: 50, height: 50)
                    .clipShape(Circle())
                    .offset(x: cos(CGFloat(rotationAngle) / 180.0 * .pi) * 100,
                            y: sin(CGFloat(rotationAngle) / 180.0 * .pi) * 100)
                    .rotationEffect(.degrees((rotationAngle + 240)), anchor: .center)
            }
            .padding(.horizontal)
            
            Spacer()
        }
        .onAppear {
            withAnimation(Animation.linear(duration: 8).repeatForever(autoreverses: false)) {
                rotationAngle += 360
            }
        }
    }
}

#Preview{
        AnotherCircleTry()
}
iOS版 SwiftUI

评论


答:

1赞 rob mayoff 11/17/2023 #1

您需要在修饰符之前应用相反的旋转:offset

Image("image-1")
    .resizable()
    .frame(width: 50, height: 50)
    .clipShape(Circle())
    .rotationEffect(.degrees(-rotationAngle), anchor: .center) // <- NEW
    .offset(
        x: cos(CGFloat(rotationAngle) / 180.0 * .pi) * 100,
        y: sin(CGFloat(rotationAngle) / 180.0 * .pi) * 100
    )
    .rotationEffect(.degrees(rotationAngle), anchor: .center)