我正在尝试使用UIBezierPath
创建一个矩形。我采用了两种不同的方法来绘制它。此外,我将笔画宽度增加到25像素。
第一种方法:使用closePath
UIBezierPath *bpath = [UIBezierPath bezierPath];
[bpath moveToPoint:CGPointMake(x, y)];
[bpath addLineToPoint:CGPointMake(x + w, y)];
[bpath addLineToPoint:CGPointMake(x + w, y + h)];
[bpath addLineToPoint:CGPointMake(x, y + h)];
[bpath closePath];
输出:
第二种方法:手动关闭路径
UIBezierPath *bpath = [UIBezierPath bezierPath];
[bpath moveToPoint:CGPointMake(x, y)];
[bpath addLineToPoint:CGPointMake(x + w, y)];
[bpath addLineToPoint:CGPointMake(x + w, y + h)];
[bpath addLineToPoint:CGPointMake(x, y + h)];
[bpath addLineToPoint:CGPointMake(x, y)];
输出:
在closePath
的文档中,它显示This method closes the current subpath by creating a line segment between the first and last points in the subpath. This method subsequently updates the current point to the end of the newly created line segment, which is also the first point in the now closed subpath.
在第二种方法中,我创建了第一个和最后一个点之间的线段。那么,为什么在第二个方法矩形中没有完全描边?
注意:这些方法之间的差异仅在笔划宽度显着增加时才可见。
答案 0 :(得分:7)
不同之处在于[closePath]
方法实际上向支持UIBezierPath的底层CGPath添加了一个额外的路径元素。
如果您使用[closePath]
,那么类型为CGPathElement
的其他kCGPathElementCloseSubpath
将被追加到该最后一个线段之后的路径末尾。
当使用文档中UIBezierPath
的[containsPoint:]方法时,这一点尤为重要:
如果一个点在里面,则不认为该点被路径包围 一个开放的子路径,无论该区域是否被绘制 在填充操作期间。因此,确定打开时的鼠标命中 路径,您必须创建路径对象的副本并显式关闭 调用此方法之前的任何子路径(使用closePath方法)。
答案 1 :(得分:0)
我尝试了你的例子,确实这种情况发生在UIBezierPath
和简单的上下文CGContextAddLineToPoint
上。
无法回答你的问题,但似乎在添加
bpath.lineCapStyle = kCGLineCapSquare;
解决了这个问题。 (或CGcontext ......替代方案)。
可能closePath
考虑lineWidth和其他线参数来形成一个正确闭合的多边形,并调整路径本身以便很好地关闭。当您删除右上角(使其成为三角形)并注意到linecapstyle将不再起作用时,这变得更有可能,只有closePath
为您提供了一个漂亮的三角形。