天天看點

擁抱Core Graphics吧!

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,如需轉載請自行聯系原作者

上一篇: less 記錄
下一篇: less網站

繼續閱讀