我有一个问题,阴影形状没有动画在同一时间的光盘。


这是相应的代码。您可以通过更改方向在iPad上测试这一点。这是ContentView的直接后果。删除GeometryReader并使用固定的框架修复它。
import SwiftUI
struct ContentView: View {
    var body: some View {
        GeometryReader { geometry in
            ZStack {
                PlanetView()
                    .frame(width: geometry.size.width * 0.25, height: geometry.size.width * 0.25)
            }
            .frame(maxWidth: .infinity, maxHeight: .infinity)
        }
    }
}
struct PlanetView: View {
    var body: some View {
        GeometryReader { geometry in
            ZStack {
                Circle()
                    .fill(.blue)
                Circle()
                    .foregroundColor(.green)
                    .overlay(PlanetShadowView())
                    .frame(width: geometry.size.width * 0.8, height: geometry.size.width * 0.8)
            }
        }
    }
}
struct PlanetShadowView: View {
    var offsetRatio: CGFloat = 15/100.0
    
    func control1(_ size: CGSize) -> CGPoint {
        let xOffset = offsetRatio * size.width
        let yOffset = offsetRatio * size.height
        return .init(x: xOffset, y: size.height - yOffset)
    }
    func control2(_ size: CGSize) -> CGPoint {
        let xOffset = offsetRatio * size.width
        let yOffset = offsetRatio * size.height
        return .init(x: size.width - xOffset, y: size.height - yOffset)
    }
    
    var body: some View {
        GeometryReader { geometry in
            Path { path in
                path.move(to: CGPoint(x: 0, y: geometry.size.height / 2))
                path.addCurve(to: CGPoint(x: geometry.size.width, y: geometry.size.height / 2),
                              control1: control1(geometry.size),
                              control2: control2(geometry.size))
                path.addArc(center: CGPoint(x: geometry.size.width / 2, y: geometry.size.height / 2),
                            radius: geometry.size.width / 2,
                            startAngle: Angle(degrees: 0),
                            endAngle: Angle(degrees: 180),
                            clockwise: false)
                path.closeSubpath()
            }
            .fill(Color.black.opacity(0.25))
            .rotationEffect(.degrees(-30))
        }
    }
}
struct PlanetView_Previews: PreviewProvider {
    static var previews: some View {
        PlanetView()
    }
}发布于 2022-07-11 06:50:09
解决这一问题的方法是将行星阴影作为形状,因此它将在与其他任何事物相同的GeometryReader转换上下文中呈现。

用Xcode 13.4 / iOS 15.5测试
                Circle()
                    .foregroundColor(.green)
                    .overlay(
                        PlanetShadow()           // << here !!
                            .fill(Color.black.opacity(0.25))
                            .rotationEffect(.degrees(-30)))
                    .frame(width: geometry.size.width * 0.8, height: geometry.size.width * 0.8)
            }
        }
    }
}
struct PlanetShadow: Shape {             // << here !!
    var offsetRatio: CGFloat = 15/100.0
    func path(in rect: CGRect) -> Path {
       // calc here ...发布于 2022-07-11 18:47:04
添加.drawingGroup()。这应该使构图在显示之前呈现为一个整体。
https://stackoverflow.com/questions/72934352
复制相似问题