Применение градиента к UIBezierPath в SwiftUI Shape - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь выполнить sh следующее:

struct MultiSegmentPaths: Shape {
  func path(in rect: CGRect) -> Path {
    let path1 = UIBezierPath()
    // apply gradient to path 1
    let path2 = UIBezierPath()
    // apply gradient to path 2

    return Path(path1.append(path2).cgPath)
  }
}

Теперь я подумал, что могу обернуть каждый сегмент с Path, но это возвращает some View, что означает, что я не могу добавить два вместе.

А для применения градиента непосредственно к UIBezierPath требуется доступ к контексту, который не передается с помощью метода path(CGRect) -> Path.

Наконец, причина для создания двух путей внутри То же самое Shape, потому что мне нужно масштабировать их, сохраняя их смещения друг к другу.

1 Ответ

1 голос
/ 01 мая 2020

UIBezierPath (UIKIt) и Path (SwiftUI) - это разные вещи ... Чтобы создать Path, вы должны использовать его собственные инструменты. Далее, операция заливки (с градиентом или чем-либо еще) является операцией рисования, а не частью создания контура / фигуры.

Вот несколько примеров объединения с фигурами, заполненными градиентами. Протестировано с Xcode 11.4.

demo

struct DemoShape1: Shape {
    func path(in rect: CGRect) -> Path {
        return Path { path in
            path.addRect(rect)
        }
    }
}

struct DemoShape2: Shape {
    func path(in rect: CGRect) -> Path {
        return Path { path in
            path.addArc(center: CGPoint(x: rect.midX, y: rect.midY), radius: rect.size.height/2, startAngle: Angle(degrees: 0), endAngle: Angle(degrees: 360), clockwise: true)
        }
    }
}

struct DemoCombinedShape: View {
    var gradient1 = LinearGradient(gradient: Gradient(colors:[.blue, .yellow]), startPoint: .top, endPoint: .bottom)
    var gradient2 = LinearGradient(gradient: Gradient(colors:[.red, .black]), startPoint: .leading, endPoint: .trailing)

    var body: some View {
        // both shapes are rendered in same coordinate space
        DemoShape1().fill(gradient1)
            .overlay(DemoShape2().fill(gradient2))
    }
}

struct TestCombinedShape_Previews: PreviewProvider {
    static var previews: some View {
        DemoCombinedShape()
            .frame(width: 400, height: 300)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...