Как обвести границы uibezierpath на внутренней части пути? - PullRequest
0 голосов
/ 25 апреля 2018

Обычно, когда мы рисуем безпуть в CoreGraphics и устанавливаем для этого CGContextSetLineWidth желаемую толщину пути, он обводит внешнюю границу пути (когда ширина линии увеличивается, граница, кажется, увеличивается наза пределами пути), я хочу, чтобы толщина моей линии росла на внутренней стороне пути Безье, есть ли способ сделать это?

1 Ответ

0 голосов
/ 25 апреля 2018

Я не знаю, как можно погладить внутреннюю часть пути.Тем не менее, вы можете сделать что-то подобное, что может работать для вас.Если вы уменьшите путь и переместите его в центр с нужным количеством, он будет хорошо вписываться в нужные вам рамки.Визуальная разница между рисованием внутри и масштабированием отсутствует для простых форм, таких как прямоугольники, закругленные контуры и эллипсы, но будет отличаться для более сложных форм.Подумайте, что произойдет, если вы обведете букву B «внутренними штрихами» вместо масштабирования.

Вот как это выглядит до и после преобразования с использованием очень широкой линии.Как вы можете видеть, поглаживание линии отцентрирует ее на пути, и половина будет появляться с каждой стороны.Таким образом, чтобы преобразовать его, нам нужно переместить путь на половину ширины линии вниз и вправо, а затем уменьшить его на ширину линии.

Используя bezierPathWithRoundedRect
ширина линии 20,размер блока 200 x 300, радиус угла 50

paths

Преобразование становится таким:

viewSizeВаша ограничительная рамка для пути
lineWidth - это ширина линии
bezierPath - это ваша UIBezierPath

CGAffineTransform transform = CGAffineTransformMakeTranslation(lineWidth / 2.0,
                                                               lineWidth / 2.0);
transform = CGAffineTransformScale(transform, 
                                   (viewSize.width - lineWidth) / viewSize.width, 
                                   (viewSize.height - lineWidth) / viewSize.height);

CGPathRef reducedPath = CGPathCreateCopyByTransformingPath(bezierPath.CGPath, &transform);


ОБНОВЛЕНИЕ

Если выЧтобы сохранить соотношение сторон, масштаб можно изменить, чтобы он был одинаковым для обеих осей, используя наименьший коэффициент для обеих.

CGFloat scale = viewSize.width < viewSize.height ? (viewSize.width - lineWidth) / viewSize.width :
                                                   (viewSize.height - lineWidth) / viewSize.height;

CGAffineTransform transform = CGAffineTransformMakeTranslation(lineWidth / 2.0, lineWidth / 2.0);
transform = CGAffineTransformScale(transform, scale, scale);

CGPathRef reducedPath = CGPathCreateCopyByTransformingPath(bezierPath.CGPath, &transform);
...