如何在贝塞尔路径中平滑线的关节?

时间:2014-09-12 13:21:54

标签: ios objective-c core-graphics uibezierpath

我正在尝试使用UIBezierPath绘制一个长方体形状。我的绘图代码如下:

((x,y)是我UIView的起源,(h,w)是它的大小)

UIBezierPath *bpath1 = [UIBezierPath bezierPath];
[bpath1 moveToPoint:CGPointMake(x, y + h * 0.4)];
[bpath1 addLineToPoint:CGPointMake(x, y + h)];
[bpath1 addLineToPoint:CGPointMake(x + w - (w * 0.4), y + h)];
[bpath1 addLineToPoint:CGPointMake(x + w - (w * 0.4), y + h * 0.4)];
[bpath1 closePath];


UIBezierPath *bpath2 = [UIBezierPath bezierPath];
[bpath2 moveToPoint:CGPointMake(x + w * 0.4, y)];
[bpath2 addLineToPoint:CGPointMake(x + w, y)];
[bpath2 addLineToPoint:CGPointMake(x + w - (w * 0.4), y + h * 0.4];
[bpath2 addLineToPoint:CGPointMake(x, y + h * 0.4];
[bpath2 closePath];

UIBezierPath *bpath3 = [UIBezierPath bezierPath];
[bpath3 moveToPoint:CGPointMake(x + w, y)];
[bpath3 addLineToPoint:CGPointMake(x + w, y + h - (h * 0.4))];
[bpath3 addLineToPoint:CGPointMake(x + w - (w * 0.4), y + h)];
[bpath3 addLineToPoint:CGPointMake(x + w - (w * 0.4), y + h * 0.4];
[bpath3 closePath];

我创建了3条路径,因为我希望每条路径都有不同的alpha值。我得到了所需的输出,如下所示:

General output

但令我惊讶的是h(身高)的值很少,我的形状如下:

Strange shape for some <code>h</code> values

现在,这种形状出现的值的数量非常少。由于渲染代码每次都相同,我不明白bezier路径的这种奇怪行为。为什么bezier路径显示这种行为,有没有办法平滑这些关节?

2 个答案:

答案 0 :(得分:2)

查看lineCapStylelineJoinStyle。具体来说,我认为这是因为lineJoinStyle默认为Mitre,并将其更改为Round或更改miterLimit

我认为这与UIBezierPath not drawing a smooth curve

具有相同的解决方案

答案 1 :(得分:0)

如果您正在使用UIView,那么adam的解决方案就可以了。但是如果你正在使用CaShapeLayer(在我的情况下),那么你必须设置lineJoin的{​​{1}}属性,而不是路径。 解释了此解决方案here