使用Quartz2D進(jìn)行繪圖

來來來钓葫,好玩的東西終于來了悄蕾。接下來的幾篇,咱們都將要聊一聊iOS中繪制圖像的事兒哈。之前有一篇說到cell分割線頂頭的方法中帆调,有童鞋留言說還可以自己繪制奠骄。咳咳番刊,會了繪圖這個就不是難事兒啦~

還有很多App里面超炫的特效含鳞,其實(shí)也都是基于各種繪圖、路徑噠芹务。來吧蝉绷,騷年~讓我們浪起來。

在此之前枣抱,分享了一些關(guān)于繪圖方面的基礎(chǔ)潜必。可以通過傳輸門快捷進(jìn)入:

1.繪圖系列之:使用Quartz2D進(jìn)行繪圖

2.繪圖系列之:Quartz2D進(jìn)行渲染

3.繪圖系列之:OC繪制基本圖形

4.繪圖系列之:OC繪制餅狀圖沃但、柱狀圖和扇形圖

1. Quartz2D

  • Quartz 2D是一個二維繪圖引擎磁滚,同時支持iOS和Mac OS X系統(tǒng)(跨平臺,純 C 語言的)宵晚。包含在 Core Graphics 框架中垂攘。
  • Quartz 2D能完成的工作
    • 繪制圖形 : 線條\三角形\矩形\圓\弧等
    • 繪制文字
    • 繪制\生成圖片(圖像)
    • 讀取\生成PDF
    • 截圖\裁剪圖片
    • 餅狀圖、柱狀圖淤刃、折線圖
  • 自定義UI控件

注意:
Quartz 2D 是蘋果官方的二維繪圖引擎晒他,同時支持 iOS 和 Mac OS X 系統(tǒng)。
Cocos2D(Cocos2D-x逸贾、Cocos2D-iPhone陨仅、Cocos2D-HTML5等), Cocos2D 是一個第三方開源的2D游戲框架。做2D 游戲的 還有 Sprite Kit铝侵。 一般3D 游戲用 unity3D灼伤。

1.1 Quartz2D 繪圖主要步驟

  • 獲取【context】對象

  • 向【context】對象中添加【路徑】

  • 渲染(把【context】中的圖形會知道對應(yīng)的設(shè)備上)

  • 一定要自定義一個view,把contxt和執(zhí)行渲染的方法都放在自定義的view中

1.2 drawRect:

  • 為什么要實(shí)現(xiàn)drawRect:方法才能繪圖到view上咪鲜?

因?yàn)樵赿rawRect:方法中才能取得跟view相關(guān)聯(lián)的context

  • drawRect:方法在什么時候被調(diào)用狐赡?

當(dāng)view第一次顯示到屏幕上時(加到UIWindow上顯示出來)
重繪的時候:調(diào)用view的setNeedsDisplay或者setNeedsDisplayInRect:

1.3 Graphics Context

  • Graphics Context 是一個數(shù)據(jù)類型(CGContextRef),用于封裝 Quartz 繪制圖像到輸出設(shè)備的信息疟丙。

  • 設(shè)備可以是PDF文件颖侄、bitmap或者顯示器的窗口。 CGContextRef 對應(yīng)繪畫者模式中的 Page享郊。

  • 當(dāng)用 Quartz 繪圖時览祖,所有設(shè)備相關(guān)的特性都包含在Graphics Context 中。通過給Quartz 指定不同的 Graphics Context炊琉,就可將相同的圖像繪制到不同的設(shè)備上展蒂。

  • Quartz2D提供了以下幾種類型的Graphics Context:

    • Bitmap Graphics Context
    • PDF Graphics Context
    • Window Graphics Context
    • Layer Graphics Context(UI控件)重點(diǎn)
    • Printer Graphics Context

1.4 繪圖路徑和內(nèi)存管理

1.4.1 繪制路徑

  • drawRect:(CGRect)rect中的rect指的就是繪圖view的bounds
- (void)drawRect:(CGRect)rect {
    //1.獲取圖形上下文對象
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    //2.創(chuàng)建路徑
    CGMutablePathRef pathM = CGPathCreateMutable();

    //設(shè)置起點(diǎn)
    CGPathMoveToPoint(pathM, NULL, 50, 50);

    //加線
    CGPathAddLineToPoint(pathM, NULL, 200, 200);

    // 把路徑添加到圖形上下文中
    CGContextAddPath(ctx, pathM);

    //3.渲染
    CGContextStrokePath(ctx);

    //釋放內(nèi)存
// CGPathRelease(pathM);

    CFRelease(pathM);
}

1.4.2 使用靜態(tài)分析工具

  • 靜態(tài)分析工具的作用
    • 不僅能夠檢測內(nèi)存泄漏的問題,還能檢測其他的問題.
    • 這個工具僅僅是靜態(tài)的在分析內(nèi)存的問題,并不能真正的檢測內(nèi)存泄漏的問題.
內(nèi)存泄漏的靜態(tài)分析工具

1.4.3 使用Path 對象時的內(nèi)存管理問題

使用Path對象的時候,一定要注意內(nèi)存的問題,一定要注意內(nèi)存釋放玄货。

  1. 凡是遇到 retain 、 copy 悼泌、 create 出的對象, 都需要進(jìn)行 release
  2. 但是CGPathCreateMutable()不是 OC 方法, 所以不是調(diào)用 某個對象的 release方法
  3. CGXxxxxCreate 對應(yīng)的就有 CGXxxxxRelease松捉。
  4. 通過 CFRelease(任何類型)可以釋放任何類型。
  • CFRelease屬于更底層的cocafoundation框架
  1. ARC僅僅是處理oc的引用計數(shù)的問題

2. 繪制基本圖形

好了馆里,坐好了隘世,老司機(jī)開始開車?yán)病?/p>

2.1 繪制三角形

- (void)drawRect:(CGRect)rect {

//    獲取context
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
//    創(chuàng)建起點(diǎn)
    CGContextMoveToPoint(ctx, 10, 10);
//    創(chuàng)建兩條線段的終點(diǎn)
    CGContextAddLineToPoint(ctx, 10, 90);
    CGContextAddLineToPoint(ctx, 90, 90);
//    閉合path,讓他自動回到原點(diǎn)
    CGContextClosePath(ctx);
//    執(zhí)行渲染
    CGContextStrokePath(ctx);

}

2.2 繪制四邊形

- (void)drawRect:(CGRect)rect {
    // Drawing code
//    獲取context對象
    CGContextRef ctx = UIGraphicsGetCurrentContext();
//    添加路徑
    CGContextAddRect(ctx, CGRectMake(10, 10, 50, 50));
//    執(zhí)行渲染
    CGContextStrokePath(ctx);
    
}

2.3 繪制橢圓鸠踪,也可以通過這種方式畫圓

- (void)drawRect:(CGRect)rect {
//    獲取context
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
//    添加橢圓丙者,通過矩形的方式。給出矩形的起點(diǎn)坐標(biāo)营密,長寬械媒,繪制一個內(nèi)切橢圓
    CGContextAddEllipseInRect(ctx, CGRectMake(10, 10, 80, 50));
    
//    渲染
    CGContextStrokePath(ctx);
}

2.4 繪制圓弧

- (void)drawRect:(CGRect)rect {
//    獲取context
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
//    繪制扇形。參數(shù):1+2评汰,圓點(diǎn)坐標(biāo)纷捞。參數(shù)3+4,起點(diǎn)和終點(diǎn)的弧度被去。參數(shù)5:0表示順時針主儡,1表示逆時針。
    CGContextAddArc(ctx, 50, 50, 20, M_PI_4, M_PI, 1);
    
//    渲染
    CGContextStrokePath(ctx);
}

2.5 畫扇形

  • 先畫一個弧度惨缆,然后鏈接圓心糜值,最后關(guān)閉路徑就可以了。
- (void)drawRect:(CGRect)rect {
//    獲取context
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
//    繪制扇形坯墨。參數(shù):1+2寂汇,圓點(diǎn)坐標(biāo)。參數(shù)3+4捣染,起點(diǎn)和終點(diǎn)的弧度健无。參數(shù)5:0表示順時針,1表示逆時針液斜。
    CGContextAddArc(ctx, 50, 50, 20, M_PI_4, M_PI, 1);
    
    CGContextClosePath(ctx);
    
//    渲染
    CGContextStrokePath(ctx);
}

2.6 畫線段

- (void)drawRect:(CGRect)rect {
    //    獲取context對象
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    //    添加路徑:起點(diǎn)累贤、終點(diǎn)
    CGContextMoveToPoint(ctx, 10, 10);
    CGContextAddLineToPoint(ctx, 80, 80);
    //    執(zhí)行渲染

    CGContextStrokePath(ctx);
}

好了,下車~下一篇要更新一下Quartz2D的渲染模式少漆。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末臼膏,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子示损,更是在濱河造成了極大的恐慌渗磅,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異始鱼,居然都是意外死亡仔掸,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門医清,熙熙樓的掌柜王于貴愁眉苦臉地迎上來起暮,“玉大人,你說我怎么就攤上這事会烙「号常” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵柏腻,是天一觀的道長纸厉。 經(jīng)常有香客問我,道長五嫂,這世上最難降的妖魔是什么颗品? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮沃缘,結(jié)果婚禮上抛猫,老公的妹妹穿的比我還像新娘。我一直安慰自己孩灯,他們只是感情好闺金,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著峰档,像睡著了一般败匹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上讥巡,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天掀亩,我揣著相機(jī)與錄音,去河邊找鬼欢顷。 笑死床三,一個胖子當(dāng)著我的面吹牛十气,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼饼暑,長吁一口氣:“原來是場噩夢啊……” “哼司抱!你這毒婦竟也來了余境?” 一聲冷哼從身側(cè)響起钓账,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎题暖,沒想到半個月后按傅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捉超,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年唯绍,在試婚紗的時候發(fā)現(xiàn)自己被綠了拼岳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡况芒,死狀恐怖惜纸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情牛柒,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布痊乾,位于F島的核電站皮壁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏哪审。R本人自食惡果不足惜蛾魄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望湿滓。 院中可真熱鬧滴须,春花似錦、人聲如沸叽奥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽朝氓。三九已至魔市,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赵哲,已是汗流浹背待德。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留枫夺,地道東北人将宪。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像橡庞,于是被迫代替她去往敵國和親较坛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容