2014-09-12 3 views
8

Я пытаюсь сделать прямоугольник, используя UIBezierPath. Я применил два разных способа сделать это. Кроме того, я увеличил ширину хода до 25 пикселей.В чем разница между закрытием пути безье с помощью функции closePath и его закрытием вручную?

Первый метод: Используя closePath

UIBezierPath *bpath = [UIBezierPath bezierPath]; 

[bpath moveToPoint:CGPointMake(x, y)]; 
[bpath addLineToPoint:CGPointMake(x + w, y)]; 
[bpath addLineToPoint:CGPointMake(x + w, y + h)]; 
[bpath addLineToPoint:CGPointMake(x, y + h)]; 
[bpath closePath]; 

Выход:

Using closePath

Второй метод: Закрытие путь вручную

UIBezierPath *bpath = [UIBezierPath bezierPath]; 

[bpath moveToPoint:CGPointMake(x, y)]; 
[bpath addLineToPoint:CGPointMake(x + w, y)]; 
[bpath addLineToPoint:CGPointMake(x + w, y + h)]; 
[bpath addLineToPoint:CGPointMake(x, y + h)]; 
[bpath addLineToPoint:CGPointMake(x, y)]; 

Выход:

Closing path manually

В документации closePath он говорит This method closes the current subpath by creating a line segment between the first and last points in the subpath. This method subsequently updates the current point to the end of the newly created line segment, which is also the first point in the now closed subpath.

А во втором методе я создаю отрезок между первой и последней точек. Итак, почему во втором методе прямоугольник не полностью поглажен?

Примечание: Разница между этими методами видна только при значительном увеличении ширины хода.

ответ

6

Разница в том, что метод [closePath] фактически добавляет дополнительный элемент пути в базовый CGPath, который поддерживает UIBezierPath.

Если вы используете [closePath], то дополнительный конец CGPathElement с типом kCGPathElementCloseSubpath будет добавлен в конец пути сразу после этого последнего сегмента линии.

Это особенно важно при использовании [containsPoint:] метод UIBezierPath из документации:

Точка не считается быть заключена в пути, если он находится внутри открытого подпути, независимо о том, будет ли эта область окрашена во время операции заполнения. Поэтому, чтобы определить образы мыши по открытым путям , вы должны создать копию объекта пути и явно закрыть любые подпутники (используя метод closePath) перед вызовом этого метода.

0

Я пробовал ваш пример, и это действительно происходит как с UIBezierPath, так и с простым рисунком по контексту с CGContextAddLineToPoint.

Не могу ответить на ваш вопрос, но мне кажется, что добавление

bpath.lineCapStyle = kCGLineCapSquare;

решает именно этот вопрос. (или альтернативу CGcontext ...).

Вероятно, closePath учитывает линейную ширину и другие параметры линии для формирования правильно закрытого многоугольника и корректирует сам путь, который должен быть закрыт красиво. Это становится более вероятным, поскольку вы удаляете свой верхний правый угол (чтобы сделать его треугольником) и заметили, что linecapstyle больше не будет работать, только closePath дает вам приятный треугольник.

Смежные вопросы