gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:53:22 25 4
gpt4 key购买 nike

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

最佳答案

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

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

Using bezierPathWithRoundedRect
line width 20, box size 200 x 300, corner radius 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);

关于ios - 如何在路径内部描画 uibezierpath 的边界?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50016030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com