2013-10-04 3 views
11

У меня есть два пути безье, которые я хотел бы объединить, чтобы сформировать союз, чтобы я мог погладить всю внешнюю форму. В моем случае это речевой пузырь с хвостом, поэтому, хотя это не сложная форма, было бы довольно сложно создать его с помощью одного пути.Создание объединения двух траекторий безье

Существует не API-интерфейс Core Graphics для создания объединений. Я ошибаюсь?

Если я не знаю, знает ли кто-нибудь об библиотеке, которая может справиться с этим? Я искал GitHub безрезультатно.

+1

Я не буду оставлять это как ответ на случай, если кто приходит вместе с библиотекой на GitHub, но: Нет, для этого нет встроенного API. Обычный хак вокруг него заключается в том, чтобы погладить, а затем заполнить; заполнение (с цветом фона пузыря) покрывает пересекающиеся штрихи. Удостоверьтесь, что вы удвоите ширину линии, так как это будет фактически внешним ударом с половиной ширины линии. –

+0

Привет, Питер. Спасибо, на данный момент это приемлемое решение, хотя оно требует, чтобы я проходил через рисование в контексте. Было бы лучше создать слой фигуры. – tarmes

+0

Я также нашел эту библиотеку для NSBezierPath. Я предполагаю, что порт для UIBezierPath будет тривиальным: http://losingfight.com/blog/2011/07/09/how-to-implement-boolean-operations-on-bezier-paths-part-3/ – tarmes

ответ

8

UIBezierPath делает это, если вы работаете с закрытыми формами.

UIBezierPath *firstPath = [UIBezierPath bezierPath]; 
// build your path 

UIBezierPath *secondPath = [UIBezierPath bezierPath]; 
// build your path 

[firstPath appendPath:secondPath]; 
+0

I ' я просто попробовал это. В результате перекрытие становится дырой - так что это вовсе не создает союз. – tarmes

+2

попытайтесь изменить путь первого или второго до объединения: UIBezierPath * secondPath = [[UIBezierPath bezierPath] bezierPathByReversingPath]; – cescofry

+0

Nope. Я пробовал каждую комбинацию (1-й + 2-й, 1-й + 2-й, 2-й, 2-й, 2-й, 2-й) .... – tarmes

1

В Swift 3: Beizerpath может быть объединение по: -

override func draw(_ rect: CGRect) { 
    super.draw(rect) 

    UIColor.black.setStroke() 
    UIColor.red.setFill() 

    let currentContext = UIGraphicsGetCurrentContext() 
    currentContext?.saveGState() 

    let path = drawTopView() 
    path.lineWidth = 5.0 
    path.fill() 
    path.stroke() 

    let middlepath = drawMiddleView() 
    middlepath.lineWidth = 2.0 
    middlepath.fill() 
    middlepath.stroke() 

    path.append(middlepath) 
    currentContext?.restoreGState() 
} 
Смежные вопросы