如何在路径内部描画 uibezierpath 的边界?

How to stroke the boundary of a uibezierpath on the inside of the path?

通常,当我们在CoreGraphics中绘制贝塞尔曲线,并设置此'CGContextSetLineWidth'为所需的路径粗细时,它会在路径的外边界上描边(随着线宽的增加,边界看起来在路径的外侧增长),我希望我的线条粗细在贝塞尔曲线路径的内侧增长,有没有办法做到这一点?

我不知道在路径内部描边的方法。但是,您可以完成类似的事情,这可能对您有用。如果您缩小路径并将其以正确的量移动到中心,它将很好地适合您想要的范围。对于矩形、圆角矩形和椭圆形等简单形状,在内部绘制和缩放之间的视觉差异为 none,但对于更复杂的形状则不同。考虑一下如果您用 "inside strokes" 抚摸字母 B 而不是缩放它会发生什么。

这是使用很宽的线转换前后的样子。如您所见,抚摸一条线会将其置于路径的中心,使它的一半出现在每一侧。所以要转换它,我们需要将路径向下和向右移动半个线宽,然后按线宽缩小。

Using bezierPathWithRoundedRect
line width 20, box size 200 x 300, corner radius 50

然后变换就变成这样了

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