Core Graphics用于處理本地2D向量渲染和圖檔渲染。其中滿是名稱相近,讓人郁悶的C接口。
對于在iOS上程式設計有一段時間的人來說有别的方法也會盡量避免使用這些C函數。
畢竟直接用xCode已有控件的話,隻要拖一拖,然後少許的代碼就可以做出某些效果,何必
自找苦吃?!但是Core Graphics有一個很大的優點:快! ps,我不是說要重複找輪子。
繪制在drawRect:方法中進行
當一個View需要繪制的時候,drawRect:方法會被調用。在這個方法中Core Graphics就會發揮作用,
你指定的區域會被重新繪制。但是你沒法直接繪制UIView,而是繼承UIView并自己實作drawRect:這個方法來進行繪制。
找到繪制的上下文
在繪制先需要保證繪制所在的上下文是在目前的View中。目前上下文使用UIGraphicsGetCurrentContext獲得。
對于目前上下文,可以了解為Core Graphics對于目前所操作View的繪制操作一個指針,跟蹤了全部的繪制操作。在C庫中很多。
相當于面向對象程式設計語言中一個類的self指針。示例:
1 - (void)drawRect:(CGRect)rect {
2 CGContextRef ctx = UIGraphicsGetCurrentContext();
3 // 繪制操作
4 }
在之後的代碼裡就可以用ctx來表示目前上下文。
繪制
繪制UIImage可以非常的簡單,如:
3 UIImage *img = [UIImage imageNamed:@"MyImage.png"];
4 [img drawInRect:rect];
5 }
畫線
用Core Graphics畫線和平時用筆畫線的邏輯是一樣的。先找到起始點,放下畫筆,然後給畫筆一系列的指令告訴它之後
往哪裡畫。每往下畫一段都以上一段的終點為起點。用函數CGContextMoveToPoint把畫筆移動到起始點。然後用函數
CGContextAddLineToPoint指定線條的終點,并在這兩點之間畫線。其他,還可以指定線條的顔色等。下面用具體的代碼
來說明。代碼:
<a></a>
1 - (void)drawRect:(CGRect)rect
2 {
3 // 擷取目前繪圖上下文
4 CGContextRef con = UIGraphicsGetCurrentContext();
5
6 // 繪制箭杆部分
7 CGContextMoveToPoint(con, 100, 100);
8 CGContextAddLineToPoint(con, 100, 25);
9 CGContextSetLineWidth(con, 20);
10 CGContextStrokePath(con);
11
12 // 繪制箭頭部分
13 CGContextSetFillColorWithColor(con, [[UIColor redColor] CGColor]);
14 CGContextMoveToPoint(con, 80, 25);
15 CGContextAddLineToPoint(con, 100, 0);
16 CGContextAddLineToPoint(con, 120, 25);
17 CGContextFillPath(con);
18 }
最後結果,如圖:
繪制長方形
繪制是用CGRect變量指定位置和長,寬值。然後把該變量作為參數傳給函數CGContextAddRect
1 - (void)drawRect:(CGRect)rect {
2
3 CGContextRef context = UIGraphicsGetCurrentContext();
4
5 CGContextSetLineWidth(context, 2.0);
6
7 CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor);
8
9 CGRect rectangle = CGRectMake(60,170,200,80);
10
11 CGContextAddRect(context, rectangle);
12
13 CGContextStrokePath(context);
14 }
效果如下:
繪制上下文狀态儲存
從上面繪制的例子中可以看出。即使隻是簡單的畫一條線也需要調好幾個函數來設定這條線的
顔色、寬度,沿着哪條路徑繪制等屬性。 Core Graphics會儲存這些屬性在其内部的棧中。這個繪制狀态就好比是一直筆,
你可以換筆頭,顔色來畫出不同的效果。但是如果你忘記把所有的東西換回去,那麼下次再畫出來的效果難保不會出乎意料。
函數CGContextSaveGState和函數CGContextRestoreGState專門用來處理繪制狀态。CGContextSaveGState函數
就相當于給你目前的繪制狀态打了個書簽,之後你可以任意修改你想要修改的屬性。然後可以用函數CGContextRestoreGState來重置繪制狀态,
回到打了書簽的地方。這兩個函數必須要配對使用! 否則的話,繪制狀态就全部亂了,要不繪出來的不是你想要,要不繪制都無法繼續。
3 CGContextRef ctx = UIGraphicsGetCurrentContext();
4
5 // 設定屬性
6 CGColorRef whiteColor = [UIColor whiteColor].CGColor;
7 CGColorRef lightColor = _lightColor.CGColor;
8 CGColorRef darkColor = _darkColor.CGColor;
9 CGColorRef shadowColor = [UIColor colorWithRed:.2f green:.2f blue:.2f alpha:.5f].CGColor;
10
11 CGContextSetFillColorWithColor(ctx, whiteColor);
12 CGContextFillRect(ctx, _paperRect);
13
14 // 儲存繪制屬性
15 CGContextSaveGState(ctx);
16
17 // 繪制。。。
18
19 // 還原繪制屬性
20 CGContextRestoreGState(ctx);
21 }
View的重繪
蘋果文檔的一段話說的非常清楚:
對遮擋您的視圖的其它視圖進行移動或删除操作。
将視圖滾出螢幕,然後再重新回到螢幕上。
最後,暫時先總結這麼多,後面會陸續深入講解這部分内容。隻要參考着蘋果的官方文檔多練。在實際開發中多用。你自然會對Core Graphics駕輕就熟。
希望此文對你有所幫助。謝謝!
歡迎加群互相學習,共同進步。QQ群:iOS: 58099570 | Android: 572064792 | Nodejs:329118122 做人要厚道,轉載請注明出處!
本文轉自張昺華-sky部落格園部落格,原文連結:http://www.cnblogs.com/sunshine-anycall/archive/2012/07/20/2600426.html,如需轉載請自行聯系原作者