Смещение тени с помощью SwiftUI Shape - PullRequest
0 голосов
/ 20 октября 2019

Я пытаюсь нарисовать круг в SwiftUI, используя Shape, Geometry reader и Path, я хочу, чтобы тень находилась прямо под кругом, но тень выходит со смещением, и я не могу заставить ее нарисовать гдеон должен:

shadow offset problem


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))
                .padding()
                .shadow(color: .gray, radius: 1.0, x: 0.0, y: 0.0)
            }
         }
    }
}

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),
                                radius: radiusOfRing,
                                startAngle: Angle(radians: 0.0),
                                delta: Angle(radians: Double.pi * 2.0 ))

        return path
    }
}




1 Ответ

0 голосов
/ 20 октября 2019

ОК. Так что, похоже, мне удалось решить проблему. Что-то происходит с шириной / высотой, которая взаимодействует с кодом для вычисления местоположения тени - кажется, что положение тени исходит от размеров рамки, а не от формы.

Добавление

.aspectRatio(contentMode: .fit)

решает проблему

Кроме того, кажется, что .shadow автоматически устанавливает смещение по умолчанию на то же значение, что и радиус, поэтому для получения реального смещения 0,0 необходимоустановите его относительно радиуса, например:

.shadow(radius: 10.0, x: -10.0, y: -10.0)

Выглядит для меня как ошибка, но эта работа решает эту проблему:

enter image description here

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...