此類(lèi)是Core Graphics框架關(guān)于path的一個(gè)封裝。
此類(lèi)可以定義簡(jiǎn)單的形狀,如橢圓或者矩形,或者有多個(gè)直線和曲線段組成的形狀。
1.UIBezierPath對(duì)象是CGPathRef數(shù)據(jù)類(lèi)型的封裝。path如果是基于矢量形狀的,都用直線和曲線段去創(chuàng)建。我們使用直線段去創(chuàng)建矩形和多邊形,使用曲線段去創(chuàng)建?。╝rc),圓或者其他復(fù)雜的曲線形狀。每一段都包括一個(gè)或者多個(gè)點(diǎn),繪圖命令定義如何去詮釋這些點(diǎn)。每一個(gè)直線段或者曲線段的結(jié)束的地方是下一個(gè)的開(kāi)始的地方。每一個(gè)連接的直線或者曲線段的集合成為subpath。一個(gè)UIBezierPath對(duì)象定義一個(gè)完整的路徑包括一個(gè)或者多個(gè)
subpaths。使用步驟:
(1)創(chuàng)建一個(gè)path對(duì)象。
(2)使用方法moveToPoint:去設(shè)置初始線段的起點(diǎn)。
(3)添加line或者curve去定義一個(gè)或者多個(gè)subpaths。
(4)改變UIBezierPath對(duì)象跟繪圖相關(guān)的屬性。例如,我們可以設(shè)置stroked path的屬性lineWidth和lineJoinStyle。也可以設(shè)置filled path的屬性u(píng)sesEvenOddFillRule。
2.使用UIBezierPath創(chuàng)建幾何圖形或者折現(xiàn) 如:
UIBezierPath *path = [UIBezierPath bezierPath]; //創(chuàng)建
[path moveToPoint:CGPointMake(100 , 100)]; //設(shè)置開(kāi)始的起點(diǎn)
[path addLineToPoint:CGPointMake(200, 150)];//添加繪制點(diǎn)subPath
[path addLineToPoint:CGPointMake(300, 10)]; //添加繪制點(diǎn)subPath
[path closePath]; //此句可以連接起點(diǎn)和最后一個(gè)繪制點(diǎn)
[path stroke]; //這句是最關(guān)鍵的,將path繪制出來(lái),如果不寫(xiě)這句,路線將不會(huì)繪制出來(lái)
closePath方法不僅結(jié)束一個(gè)shape的subpath表述,它也在最后一個(gè)點(diǎn)和第一個(gè)點(diǎn)之間畫(huà)一條線段,如果我們畫(huà)多邊形的話,這個(gè)一個(gè)便利的方法我們不需要去畫(huà)最后一條線。
3.在path中添加arcs
//? 畫(huà)一個(gè)實(shí)心圓
UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(50, 50)];
//? ? 實(shí)心圓, 以self.center為圓心,50為半徑,M_PI_2即90度為開(kāi)始角度,M_PI即180度為結(jié)束為止角度數(shù) 逆時(shí)針繪制
[path addArcWithCenter:self.center radius:50 startAngle:M_PI_2 endAngle:M_PI clockwise:YES];
[path setLineWidth:5.0];
[[UIColor blueColor] setStroke];
[[UIColor redColor] setFill];
[path stroke];
[path fill];//此方法為填充圓的方法
如果我們想要把a(bǔ)rc 段加入到path中,我們必須直接修改path對(duì)象的CGPathRef數(shù)據(jù)類(lèi)型。
4.在path中添加curve。
UIBezierPath類(lèi)提供了添加立方和二次貝塞爾曲線的支持。曲線段在當(dāng)前點(diǎn)開(kāi)始,在指定的點(diǎn)結(jié)束。曲線的形狀有開(kāi)始點(diǎn),結(jié)束點(diǎn),一個(gè)或者多個(gè)控制點(diǎn)的切線定義。下圖顯示了兩種曲線類(lèi)型的相似,以及控制點(diǎn)和curve形狀的關(guān)系。
通過(guò)下面兩個(gè)方法可以添加曲線path。
Cubic curve:addCurveToPoint:controlPoint1:controlPoint2:
Quadratic curve:addQuadCurveToPoint:controlPoint:
//? ? 拋物線,以(200,200)為切點(diǎn)? (200,50)為終點(diǎn) (50,50)為起點(diǎn)
[path addQuadCurveToPoint:CGPointMake(200, 50) controlPoint:CGPointMake(200, 200)];
//? ? 拋物線,以(50, 50)為起點(diǎn),(20,50)終點(diǎn),(300,100)和(100,300)為切點(diǎn)
[path addCurveToPoint:CGPointMake(200, 250) controlPoint1:CGPointMake(200, 50) controlPoint2:CGPointMake(50, 200)];
因?yàn)閏urve依賴(lài)于path的當(dāng)前點(diǎn),所以在調(diào)用上面兩個(gè)方法之前要設(shè)置當(dāng)前點(diǎn)。當(dāng)曲線完成之后,current點(diǎn)會(huì)被更新為指定的end point。
5.創(chuàng)建橢圓或者矩形path。
橢圓和長(zhǎng)方形是最常見(jiàn)的path。都采用曲線和直線段的組合。UIBezierPath類(lèi)包括bezierPathWithRect:andbezierPathWithOvalInRect:方法去創(chuàng)建橢圓或者矩形形狀的path。這兩個(gè)方法都創(chuàng)建了一個(gè)新的path對(duì)象,并用指定的形狀去初始化它們。我們可以使用返回的path對(duì)象或者根據(jù)需要去添加更多的形狀。
如果我們想在一個(gè)存在的path對(duì)象上面添加一個(gè)矩形,則我們必須使用moveToPoint,addLinePoint,和closePath方法,此可以做任何多邊形。
如果想在一個(gè)存在path對(duì)象上添加一個(gè)橢圓,則最簡(jiǎn)單的方法是使用core Graphics。盡管可以使用addQuadCurveToPoint:controlPoint:去創(chuàng)建一個(gè)近似的橢圓,core Graphics的CGPathAddEllipseInRect方法非常的簡(jiǎn)單使用,也更準(zhǔn)確。
6.使用Core Graphics函數(shù)去修改path。
UIBezierPath類(lèi)只是CGPathRef數(shù)據(jù)類(lèi)型和path繪圖屬性的一個(gè)封裝。雖然通常我們可以用UIBezierPath類(lèi)的方法去添加直線段和曲線段,UIBezierPath類(lèi)還提供了一個(gè)屬性CGPath,我們可以用來(lái)直接修改底層的path data type。如果我們希望用Core Graphics 框架函數(shù)去創(chuàng)建path,則我們要用到此屬性。
有兩種方法可以用來(lái)修改和UIBezierPath對(duì)象相關(guān)的path。可以完全的使用Core Graphics函數(shù)去修改path,也可以使用Core Graphics函數(shù)和UIBezierPath函數(shù)混合去修改。第一種方法在某些方面相對(duì)來(lái)說(shuō)比較容易。我們可以創(chuàng)建一個(gè)CGPathRef數(shù)據(jù)類(lèi)型,并調(diào)用我們需要修改path信息的函數(shù)。下面的代碼就是賦值一個(gè)新的CGPathRef給UIBezierPath對(duì)象。
CGMutablePathRef cgPath = CGPathCreateMutable();
//繪制橢圓 橢圓距離左60,上100,橫向直徑10,豎向直徑80
CGPathAddEllipseInRect(cgPath, NULL, CGRectMake(60, 100, 10, 80));
CGPathAddEllipseInRect(cgPath, NULL, CGRectMake(50, 50, 200, 200));
UIBezierPath* aPath = [UIBezierPath bezierPath];
aPath.CGPath = cgPath;
//? ? aPath.usesEvenOddFillRule = YES;
//釋放path
CGPathRelease(cgPath);
[aPath stroke];
如果我們使用Core Graphics函數(shù)和UIBezierPath函數(shù)混合方法,我們必須小心的移動(dòng)path 信息在兩者之間。因?yàn)閁IBezierPath類(lèi)擁有自己底層的CGPathRef data type,我們不能簡(jiǎn)單的檢索該類(lèi)型并直接的修改它。相反,我們應(yīng)該生成一個(gè)副本,然后修改此副本,然后賦值此副本給CGPath屬性,如下代碼:
Mixing Core Graphics andUIBezierPathcalls
UIBezierPath*? ? aPath = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, 300, 300)];
// Get the CGPathRef and create a mutable version.
CGPathRef cgPath = aPath.CGPath;
CGMutablePathRef? mutablePath = CGPathCreateMutableCopy(cgPath);
// Modify the path and assign it back to the UIBezierPath object
CGPathAddEllipseInRect(mutablePath, NULL, CGRectMake(50, 50, 200, 200));
aPath.CGPath = mutablePath;
// Release both the mutable copy of the path.
CGPathRelease(mutablePath);
7.rendering(渲染)Bezier Path對(duì)象的內(nèi)容。
當(dāng)創(chuàng)建一個(gè)UIBezierPath對(duì)象之后,我們可以使用它的stroke和fill方法在current graphics context中去渲染它。在調(diào)用這些方法之前,我們要進(jìn)行一些其他的任務(wù)去確保正確的繪制path。
使用UIColor類(lèi)的方法去stroke和fill想要的顏色。
設(shè)置形狀在目標(biāo)視圖中的位置。如果我們創(chuàng)建的path相對(duì)于原點(diǎn)(0,0),則我們可以給current drawing context應(yīng)用一個(gè)適當(dāng)?shù)腶ffie transform。例如,我想drawing一個(gè)形狀起始點(diǎn)在(0,0),我可以調(diào)用函數(shù)CGContextTranslateCTM,并指定水平和垂直方向的translation值為10。調(diào)整graphic context相對(duì)于調(diào)整path對(duì)象的points是首選的方法,因?yàn)槲覀兛梢院苋菀椎谋4婧统蜂N(xiāo)先前的graphics state。
更新path對(duì)象的drawing 屬性。當(dāng)渲染path時(shí),UIBezierPath實(shí)例的drawing屬性會(huì)覆蓋graphics context下的屬性值。
下面的代碼實(shí)現(xiàn)了在一個(gè)自定義view中實(shí)現(xiàn)drawRect:方法中去繪制一個(gè)橢圓。橢圓邊框矩形的左上角位于視圖坐標(biāo)系統(tǒng)的點(diǎn)(50,50)處。
Drawing a path in a view
- (void)drawRect:(CGRect)rect{
//圓原始位置
UIBezierPath* aPath = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, 100, 100)];
[[UIColor blueColor] setStroke];
[[UIColor redColor] setFill];
CGContextRef aRef = UIGraphicsGetCurrentContext();
//改變圓的位置
CGContextTranslateCTM(aRef, 80, 50);
aPath.lineWidth = 5;
[aPath fill];
[aPath stroke];
}