ОК. Так что, похоже, мне удалось решить проблему. Что-то происходит с шириной / высотой, которая взаимодействует с кодом для вычисления местоположения тени - кажется, что положение тени исходит от размеров рамки, а не от формы.
Добавление
.aspectRatio(contentMode: .fit)
решает проблему
Кроме того, кажется, что .shadow автоматически устанавливает смещение по умолчанию на то же значение, что и радиус, поэтому для получения реального смещения 0,0 необходимоустановите его относительно радиуса, например:
.shadow(radius: 10.0, x: -10.0, y: -10.0)
Выглядит для меня как ошибка, но эта работа решает эту проблему:
import SwiftUI
struct ContentView: View {
var body: some View {
return GeometryReader { geometry in
VStack(alignment: .center) {
BackgroundRing()
.stroke(Color.red,
style: StrokeStyle(lineWidth: geometry.size.width < geometry.size.height ? geometry.size.width / 12.0 : geometry.size.height / 12))
.shadow(radius: 30.0, x: -30.0, y: -30.0)
.aspectRatio(contentMode: .fit)
}
}
}
}
struct BackgroundRing : Shape {
func path(in rect: CGRect) -> Path {
var path: Path = Path()
let radiusOfRing: CGFloat = (rect.width < rect.height ? rect.width/2 - rect.width / 12 : rect.height/2 - rect.height / 12)
path.addRelativeArc(center: CGPoint(x: rect.width/2, y: rect.height/2), // <- this change solved the problem
radius: radiusOfRing,
startAngle: Angle(radians: 0.0),
delta: Angle(radians: Double.pi * 2.0 ))
return path
}
}