(四十七)Quartz2D引擎初步
Quartz2D是跨平臺(tái)的,同時(shí)支持iOS與Mac。
支持圓型裁剪,可以實(shí)現(xiàn)圓形頭像等功能,也支持手勢(shì)解鎖、折線圖等的制作。
對(duì)于復(fù)雜的UI界面,還可以通過(guò)Quartz2D將控件內(nèi)部的結(jié)構(gòu)畫(huà)出來(lái),可用于自定義控件。
實(shí)際上iOS大部分控件都是通過(guò)Quartz2D畫(huà)出來(lái)的,一個(gè)重要價(jià)值是自定義view。
一些基礎(chǔ)概念:
1.圖形上下文(Graphics Context):是CGContextRef類(lèi)型數(shù)據(jù)
能保存繪圖信息、繪圖狀態(tài),決定繪制的輸出目標(biāo),可以輸出到文件或者窗口。
繪制好的圖像先保存到圖形上下文,再顯示到輸出目標(biāo)。
Tip:相同的圖像,經(jīng)過(guò)不同的圖形上下文,就可以顯示到不同的地方。
Quartz2D支持的類(lèi)型:Bitmap、PDF、Window、Layer、Printer.
2.自定義view
擁有圖形上下文,并且與view有關(guān)。
步驟:
1.新建一個(gè)類(lèi),繼承自UIView。
2.實(shí)現(xiàn)drawRect: rect方法畫(huà)圖。
3.須知:
1.后面繪制的部分覆蓋前面繪制的部分。
2.Quartz2D的API是純C代碼。
3.Quartz2D來(lái)自CoreGraphics框架。
4.數(shù)據(jù)類(lèi)型和函數(shù)基本都是以CG開(kāi)頭。
重寫(xiě)UIView的drawRect方法,可以繪制圖形,繪制直線的方法:
1.繪制直線
以CGContext開(kāi)頭的,MoveToPoint、AddLineToPoint以及StrokePath方法
Tip:如果要畫(huà)獨(dú)立的直線,只要多次使用MoveToPoint即可。
Tip:drawRect函數(shù)在View第一次顯示到屏幕上的時(shí)候會(huì)調(diào)用一次,重繪時(shí)也會(huì)調(diào)用一次。
- (void)drawRect:(CGRect)rect {// 1.獲得圖形上下文CGContextRef ctx = UIGraphicsGetCurrentContext();// 2.拼接圖形(路徑)// 2.1設(shè)定起點(diǎn)CGContextMoveToPoint(ctx, 10, 10);// 2.2添加一條線從起點(diǎn)到(100,100)CGContextAddLineToPoint(ctx, 100, 100);// 2.3從上次終點(diǎn)繼續(xù)繪制CGContextAddLineToPoint(ctx, 150, 40);// 2.4回到起點(diǎn),關(guān)閉路徑CGContextAddLineToPoint(ctx, 10, 10);// 3.渲染顯示到view上,stroke是空心的形式。CGContextStrokePath(ctx);} CGContextAddRect(ctx, CGRectMake(10, 10, 100, 100));Tip:Stroke方法畫(huà)的是空心圖形,將Stroke換為Fill可得到填充圖形。
3.設(shè)置狀態(tài)的代碼(顏色、粗細(xì)):
Tip:設(shè)置狀態(tài)的代碼一定要放在渲染的前面,放在繪制函數(shù)的前后都可以。
3.1設(shè)置線寬:
CGContextSetLineWidth(ctx, 10);3.2設(shè)置顏色:有Stroke和Fill兩種方式,注意小數(shù)是 x / 255.0。 CGContextSetRGBStrokeColor(ctx, 255/255.0, 125/255.0, 0.0, 1.0)Tip:狀態(tài)只在渲染的時(shí)候確定,因此多個(gè)狀態(tài)不同的內(nèi)容應(yīng)該渲染多次。 3.3線段頭尾樣式(圓形):三中,Miter是默認(rèn)的發(fā)射狀(方形)、Round為圓形、Bevel為裁剪。
CGContextSetLineCap(ctx, kCGLineCapRound);連接點(diǎn)樣式: CGContextSetLineJoin(ctx, kCGLineJoinRound);Tip:如果使用多次渲染,那么之前繪制的路徑尾就無(wú)法繼續(xù)使用了,應(yīng)該重新確立起點(diǎn)。
Tip:CMYK是印刷色彩顏色,由青、品紅、黃、黑構(gòu)成,RGB由紅綠藍(lán)構(gòu)成。
設(shè)置顏色的一個(gè)簡(jiǎn)便方法:
使用UIColor對(duì)象的setStroke與setFill方法:如果寫(xiě)set則是全部設(shè)置。
[[UIColor redColor] setStroke];4.繪制圓和橢圓:通過(guò)外接矩形確定。
// 圓形CGContextAddEllipseInRect(ctx, CGRectMake(10, 10, 60, 60));// 橢圓CGContextAddEllipseInRect(ctx, CGRectMake(100, 100, 100, 50));5.繪制圓弧:
/*** 繪制圓弧** @param c#> 圖形上下文 description#>* @param x#> 圓心x description#>* @param y#> 圓心y description#>* @param radius#> 半徑 description#>* @param startAngle#> 起始角度 description#>* @param endAngle#> 結(jié)束角度 description#>* @param clockwise#> 圓弧生長(zhǎng)方向 0順 1逆 description#>**/CGContextAddArc(<#CGContextRef c#>, <#CGFloat x#>, <#CGFloat y#>, <#CGFloat radius#>, <#CGFloat startAngle#>, <#CGFloat endAngle#>, <#int clockwise#>);需要注意的是角度為弧度,應(yīng)該通過(guò)系統(tǒng)的宏來(lái)?yè)Q算:M_PI_2表示二分之PI,M_1_PI表示0.1PI。
另外注意一點(diǎn)這里的角度和數(shù)學(xué)定義不同,順時(shí)針為正角度,逆時(shí)針為負(fù)角度。
6.圖片和文字結(jié)合:
Tip:Quartz2D的坐標(biāo)系和數(shù)學(xué)上一致,但是UIKit框架做了轉(zhuǎn)換,和屏幕坐標(biāo)系一致都是左上角為(0,0),因此使用純C語(yǔ)言繪制出來(lái)的東西是倒著的。
利用OC來(lái)繪制字符串不需要調(diào)用和上下文:
NSString *str = @"一段文字";
[str drawAtPoint:CGPointMake(0, 0) withAttributes:nil];想把文字放到矩形框內(nèi),使用drawInRect,還可以自動(dòng)換行。 withAttributes是對(duì)狀態(tài)的設(shè)置,注意要傳入字典。
參數(shù)已經(jīng)定義成字符串常量:
NSMutableDictionary *attrs = [NSMutableDictionary dictionary];
attrs[NSForegroundColorAttributeName] = [UIColor whiteColor];
[str drawAtPoint:CGPointMake(0, 0) withAttributes:attrs];常見(jiàn)的屬性: NSForegroundColorAttributeName為文字顏色。
NSFontAttributeName為字體。
圖片的繪制:
直接繪制:
[UIImage imageNamed:@"me"];
[image drawInRect:CGRectMake(0, 0, 150, 150)];平鋪:
[UIImage imageNamed:@"me"];
[image drawAsPatternInRect:CGRectMake(0, 0, 150, 150)];轉(zhuǎn)載于:https://www.cnblogs.com/aiwz/p/6154204.html
總結(jié)
以上是生活随笔為你收集整理的(四十七)Quartz2D引擎初步的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: “况当元九小亭前”上一句是什么
- 下一篇: 求一个好听的发廊名字。