2014-09-12 26 views
8

我正在嘗試使用UIBezierPath來製作一個矩形。我採用了兩種不同的方式來繪製它。此外,我增加了行程寬度爲25像素。使用closePath函數關閉貝塞爾路徑並手動關閉貝司捷路徑有什麼區別?

第一種方法:使用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]; 

輸出:

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

輸出:

Closing path manually

在文檔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.

而在第二個方法我創建第一個和最後一個點之間的線段。那麼,爲什麼在第二個方法矩形沒有完全撫摸?

注意:這些方法之間的區別僅在筆畫寬度顯着增加時纔可見。

回答

6

不同之處在於[closePath]方法實際上是將其他路徑元素添加到支持UIBezierPath的基礎CGPath中。

如果您使用[closePath],那麼將在該最後一個線段之後立即追加一個類型爲kCGPathElementCloseSubpath的附加CGPathElement

此使用時是特別重要的[containsPoint:]從文檔一個UIBezierPath的方法:

的點不被認爲由路徑被封閉,如果它是內部 一個開放的子路徑,而不管在填充操作期間,該區域是否被塗上 。因此,要確定打開的路徑上的鼠標點擊,您必須在調用此方法之前創建路徑對象的副本並明確關閉任何子路徑(使用closePath方法)。

0

我試過你的例子,事實上,這兩種情況都發生在UIBezierPathCGContextAddLineToPoint的背景下。

不能回答你的問題,但似乎增加

bpath.lineCapStyle = kCGLineCapSquare;

解決了這個確切的問題。 (或CGcontext ...替代)。

可能closePath考慮到lineWidth和其他線參數來形成一個適當封閉的多邊形,並調整路徑本身以很好地關閉。當你刪除右上角(使其成爲三角形)並且注意linecapstyle將不再起作用時,這變得更加可能,只有closePath爲您提供了一個很好的三角形。