如何描绘路径内侧的uibezier路径的边界?

时间:2018-04-25 07:05:07

标签: ios core-graphics uibezierpath

通常,当我们在CoreGraphics中绘制一个bezierpath时,设置这个' CGContextSetLineWidth'一个理想的路径厚度,它在路径的外边界上划线(随着线宽增加,边界似乎在路径的外部增长),我希望我的线厚度在贝塞尔的内部生长路径,有没有办法做到这一点?

1 个答案:

答案 0 :(得分:3)

我不知道如何在路径内部划线。但是,您可以完成类似的操作,这可能对您有用。如果缩小路径并将其移动到具有正确数量的中心,它将很好地适合您想要的范围。对于简单的形状(如矩形,圆角和椭圆),绘制内部和缩放之间的视觉差异是无,但对于更复杂的形状会有所不同。考虑一下如果用“内部笔划”描边字母B而不是缩放它会发生什么。

以下是使用非常宽的线进行变换之前和之后的样子。正如您所看到的,抚摸一条线将使其在路径上居中,使其一半出现在路径上。因此,为了对其进行转换,我们需要将路径向下和向右移动半个线宽,然后按线宽向下缩放。

  

使用bezierPathWithRoundedRect
线宽20,方框尺寸200 x 300,圆角半径50

paths

然后变换就像这样。

viewSize是路径的边界框 lineWidth是行的宽度
bezierPathUIBezierPath

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);

<小时/> UPDATE

如果要保持纵横比,可以使用两者上的最小因子将缩放修改为在两个轴上相等。

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);