Quartz2D--貝塞爾路徑去畫(huà)圖

LitterLIP屬地: 上海
字?jǐn)?shù) 2,225

簡(jiǎn)述:

  • 1、Quartz2D是什么

    • Quartz2D是二維繪圖引擎,同時(shí)支持IOSMac
  • 2、Quartz2D能做什么

  • 1、繪制圖形:線條\三角形\矩形\圓\弧等

  • 2、繪制文字

  • 3、繪制\生成圖片(常用)

  • 4、截圖\裁剪圖片(常用)

  • 5、讀取\生成PDF(不常用)

  • 6、自定義UI控件(不常用)

  • 3、Quartz2D操作流程

  • 3.1、看完上面的,我想大家應(yīng)該知道Quartz2D是用來(lái)干什么的了吧,但是我們又該如何操作它來(lái)完成自己想完成的繪制呢,那么需要使用它,我們的知道它的一個(gè)流程:

     1、我們首先需要開(kāi)啟圖形上下文(Graphics Context):是一個(gè)CGContextRef類型的數(shù)據(jù)。
     2、然后對(duì)我們想繪制的圖片或者圖形進(jìn)行一系列的操作。
     3、最后就是渲染在我的View上面。
    
  • 3.2、那么知道流程之后,我們?cè)诳纯词裁词巧舷挛乃志哂惺裁醋饔茫?/p>

     1、介紹:
         1、在上面已經(jīng)介紹Graphics Context是一個(gè)CGContextRef類型的數(shù)據(jù),但是那為什么是已CG開(kāi)頭呢,
            是因?yàn)镼uartz2D的API來(lái)自于Core Graphics框架,數(shù)據(jù)類型和函數(shù)基本都以CG作為前綴。
     2、作用:
         1、它保存繪圖信息、繪圖狀態(tài)
         2、決定繪制的輸出目標(biāo)(繪制到什么地?去?) (輸出目標(biāo)可以是PDF?文件、Bitmap或者顯示器的窗口上)
    
  • 3.3、在Quartz2D提供了以下幾種類型的Graphics Context:

     Bitmap Graphics Context     位圖上下文
     PDF Graphics Context        PDF上下文
     Window Graphics Context     窗口上下文
     Layer Graphics Context      Layer上下文
     Printer Graphics Context    打印機(jī)上下文
    

    如果想深入了解的話,大家可以去看看官方文檔,如何英文和我一樣的話我建議大家去看看南峰子的技術(shù)博客,我覺(jué)得此大神英文真心讓我膜拜啊。

  • 3.4、如何利用Quartz2D繪制東西到view上?

     1、首先,得有圖形上下文,因?yàn)樗鼙4胬L圖信息,并且決定著繪制到什么地方去
     2、其次,那個(gè)圖形上下文必須跟view相關(guān)聯(lián),才能將內(nèi)容繪制到view上面
     3、實(shí)現(xiàn)關(guān)聯(lián)的話,需要?jiǎng)?chuàng)建一個(gè)類,并且繼承于UIView,最重要的是要實(shí)現(xiàn)- (void)drawRect:(CGRect)rect這個(gè)方法
    
     其實(shí)說(shuō)了那么多廢話都是想說(shuō)- (void)drawRect:(CGRect)rect而已,好咯,那就開(kāi)始摟代碼吧
    

代碼:

繪制圖形(線條\三角形\矩形\圓\弧\餅圖):

  • 1、線條

  • 第一種

    - (void)drawRect:(CGRect)rect {
        //1、獲取上下文
        CGContextRef ctx = UIGraphicsGetCurrentContext();
    
        //2、設(shè)置開(kāi)始畫(huà)線的點(diǎn)
        CGContextMoveToPoint(ctx, 20, 100);
    
        //3、設(shè)置結(jié)束畫(huà)線的點(diǎn)
        CGContextAddLineToPoint(ctx, 200, 100);
    
        //4、設(shè)置線條的寬度
        CGContextSetLineWidth(ctx, 5);
    
        //5、設(shè)置線條起點(diǎn)和終點(diǎn)的樣式為圓角
        CGContextSetLineCap(ctx, kCGLineCapRound);
    
        //6、設(shè)置線條的轉(zhuǎn)角的樣式為圓角
        CGContextSetLineJoin(ctx, kCGLineJoinRound);
    
        //7、設(shè)置繪圖的顏色
        [[UIColor redColor] set];
    
        //8設(shè)置第二條線的終點(diǎn)(自動(dòng)把上一條直線的終點(diǎn)當(dāng)做起點(diǎn))
        // CGContextAddLineToPoint(ctx, 300, 200);
    
        //9.渲染(繪制出一條空心的線,線條不能為實(shí)心,只有圖型可為實(shí)心)
        CGContextStrokePath(ctx);
        //CGContextFillPath(ctx);
    }
    
  • 第二種(使用了貝塞爾路徑)

    - (void)drawRect:(CGRect)rect {
        //1、獲取上下文
        CGContextRef ctx = UIGraphicsGetCurrentContext();
    
        //2、繪制內(nèi)容拼接路徑,繪制的內(nèi)容都會(huì)路徑  UIBezierPath是UIKit中的
        UIBezierPath *path = [UIBezierPath bezierPath];
    
        //3、設(shè)置開(kāi)始畫(huà)線的點(diǎn)
        [path moveToPoint:CGPointMake(50, 50)];
    
        //4、設(shè)置結(jié)束畫(huà)線的點(diǎn)
        [path addLineToPoint:CGPointMake(200, 200)];
    
        //5、給上下文添加路徑
        CGContextAddPath(ctx, path.CGPath);
    
        //繪制第二根線  這里我就不寫注釋了 和上面一樣
        path = [UIBezierPath bezierPath];
        [path moveToPoint:CGPointMake(200, 200)];
        [path addLineToPoint:CGPointMake(100, 200)];
        CGContextAddPath(ctx, path.CGPath);
    
        //6.渲染(繪制出一條空心的線,線條不能為實(shí)心,只有圖型可為實(shí)心)
        CGContextStrokePath(ctx);
        //如果大家想設(shè)置顏色,寬度,圓角狀態(tài)的話 可參考上面的,因?yàn)槎际且粯拥?}
    

    后面的話我都是使用貝塞爾路徑來(lái)實(shí)現(xiàn)繪圖,因?yàn)樗褂闷饋?lái)比較方便,易閱讀 ,善于管理,不像上面那種閱讀起來(lái)比較麻煩,如果有很多繪圖信息,老長(zhǎng)老長(zhǎng)的;

  • 2、三角形

    - (void)drawRect:(CGRect)rect {
        //1、獲取上下文
        CGContextRef ctx = UIGraphicsGetCurrentContext();
    
        //2、繪制內(nèi)容拼接路徑,繪制的內(nèi)容都會(huì)路徑  UIBezierPath是UIKit中的
        UIBezierPath *path = [UIBezierPath bezierPath];
    
        //3、設(shè)置開(kāi)始畫(huà)線的點(diǎn)
        [path moveToPoint:CGPointMake(50, 50)];
    
        //4、設(shè)置結(jié)束畫(huà)線的點(diǎn)  另外在添加了兩個(gè)點(diǎn) 最后回到最初的點(diǎn)  那么三角形就構(gòu)成了
        [path addLineToPoint:CGPointMake(200, 200)];
    
        [path addLineToPoint:CGPointMake(100, 200)];
    
        [path addLineToPoint:CGPointMake(50, 50)];
        //5、給上下文添加路徑
        CGContextAddPath(ctx, path.CGPath);
    
        //6.渲染(繪制出一條空心的線,線條不能為實(shí)心,只有圖型可為實(shí)心)
        //CGContextStrokePath(ctx);   空心
        CGContextFillPath(ctx);  //實(shí)心
    }
    
  • 3、矩形

    - (void)drawRect:(CGRect)rect {
        //1、獲取上下文
        CGContextRef ctx = UIGraphicsGetCurrentContext();
    
        //2、繪制內(nèi)容拼接路徑,繪制的內(nèi)容都會(huì)路徑  UIBezierPath是UIKit中的
        UIBezierPath *path = [UIBezierPath bezierPathWithRect:CGRectMake(20, 20, 100, 100)];
    
        //3、給上下文添加路徑
        CGContextAddPath(ctx, path.CGPath);
        //4.渲染(繪制出一條空心的線,線條不能為實(shí)心,只有圖型可為實(shí)心)
        //    CGContextStrokePath(ctx);   空心
        CGContextFillPath(ctx);  //實(shí)心
    }
    
  • 4、圓形

     //---------------------------第一種-----------------------------
    //通過(guò)矩形改變cornerRadius畫(huà)圓  也可以畫(huà)圓角的矩形
    - (void)drawRect:(CGRect)rect {
        //1、獲取上下文
        CGContextRef ctx = UIGraphicsGetCurrentContext();
    
        //2、繪制內(nèi)容拼接路徑,繪制的內(nèi)容都會(huì)路徑  UIBezierPath是UIKit中的
        UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(20, 20, 100, 100) cornerRadius:50];
    
        //3、給上下文添加路徑
        CGContextAddPath(ctx, path.CGPath);
        //4.渲染(繪制出一條空心的線,線條不能為實(shí)心,只有圖型可為實(shí)心)
        //    CGContextStrokePath(ctx);   空心
        CGContextFillPath(ctx);  //實(shí)心
    }
    //---------------------------第二種-----------------------------
    //畫(huà)圓形以及橢圓  寬度和高度一樣則是圓形 不一樣則是橢圓
    - (void)drawRect:(CGRect)rect {
        //1、獲取上下文
        CGContextRef ctx = UIGraphicsGetCurrentContext();
    
        //2、繪制內(nèi)容拼接路徑,繪制的內(nèi)容都會(huì)路徑  UIBezierPath是UIKit中的
        UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(20, 20, 50, 100)];
    
        //3、給上下文添加路徑
        CGContextAddPath(ctx, path.CGPath);
        //4.渲染(繪制出一條空心的線,線條不能為實(shí)心,只有圖型可為實(shí)心)
        //    CGContextStrokePath(ctx);   空心
        CGContextFillPath(ctx);  //實(shí)心
    }
    
  • 5、弧形

    - (void)drawRect:(CGRect)rect {
    //1、獲取上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
    //2、繪制內(nèi)容拼接路徑,繪制的內(nèi)容都會(huì)路徑  UIBezierPath是UIKit中的
    
    //為UIView的中心點(diǎn)
    CGPoint center =   CGPointMake(rect.size.width * 0.5, rect.size.height * 0.5);
    CGFloat radius = 50;
    //center       圓心
    //radius       半徑
    //startAngle   開(kāi)始角度
    //endAngle     結(jié)束角度
    //clockwise    Yes為順時(shí)針  NO為逆勢(shì)針
    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:0 endAngle:M_PI_2 clockwise:YES];
    
    //3、給上下文添加路徑
    CGContextAddPath(ctx, path.CGPath);
    //4.渲染(繪制出一條空心的線,線條不能為實(shí)心,只有圖型可為實(shí)心)
    CGContextStrokePath(ctx);//   空心
    //    CGContextFillPath(ctx);  實(shí)心
    

}
```

  • 6、餅圖

    其實(shí)餅圖就是在弧的兩端以及和中心點(diǎn)加了兩條線,成為了餅圖

    - (void)drawRect:(CGRect)rect {
        //1、獲取上下文
        CGContextRef ctx = UIGraphicsGetCurrentContext();
    
        //2、繪制內(nèi)容拼接路徑,繪制的內(nèi)容都會(huì)路徑  UIBezierPath是UIKit中的
    
        //為UIView的中心點(diǎn)
        CGPoint center =   CGPointMake(rect.size.width * 0.5, rect.size.height * 0.5);
        CGFloat radius = 50;
        //center       圓心
        //radius       半徑
        //startAngle   開(kāi)始角度
        //endAngle     結(jié)束角度
        //clockwise    Yes為順時(shí)針  NO為逆勢(shì)針
        UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:0 endAngle:M_PI_2 clockwise:YES];
    
        //上面代碼為給路徑添加了一條弧,現(xiàn)在我們?cè)诨〉膬啥艘约昂椭行狞c(diǎn)加了兩條線  為餅圖
        //這里的話  我們之間添加到坐標(biāo)點(diǎn)為中心
        [path addLineToPoint:center];
        //這里直接閉合路徑  則一條餅圖的路徑就添加完成了
        [path closePath];
    
        //3、給上下文添加路徑
        CGContextAddPath(ctx, path.CGPath);
    
        //4.渲染(繪制出一條空心的線,線條不能為實(shí)心,只有圖型可為實(shí)心)
        CGContextStrokePath(ctx);//   空心
        //    CGContextFillPath(ctx);  實(shí)心
    }
    

補(bǔ)充:

以上就是通過(guò)貝塞爾路徑畫(huà)的圖了,里面的話只要就是需要查看UIBezierPath中的一些方法,忘了看看就行,如果有喜歡直接用上下文去畫(huà)的朋友可以去看iOS-Quartz2D這位朋友寫的博客。

                    本章到此結(jié)束
            歡迎各位碼友隨意轉(zhuǎn)載并指正
最后編輯于
©著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
6人點(diǎn)贊
LitterL只是一個(gè)為了理想 漂泊的人
總資產(chǎn)2共写了1.3W字获得195个赞共171个粉丝
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,702評(píng)論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,615評(píng)論 3 419
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,606評(píng)論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,044評(píng)論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,826評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,227評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,307評(píng)論 3 442
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,447評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,992評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,807評(píng)論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,001評(píng)論 1 370
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,550評(píng)論 5 361
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,243評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,667評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,930評(píng)論 1 287
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,709評(píng)論 3 393
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,996評(píng)論 2 374

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

  • Quartz2D以及drawRect的重繪機(jī)制字?jǐn)?shù)1487 閱讀21 評(píng)論1 喜歡1一、什么是Quartz2D Q...
    PurpleWind閱讀 786評(píng)論 0 3
  • 什么是Quartz2D 是一個(gè)二維的繪圖引擎,同時(shí)支持iOS和Mac系統(tǒng) Quartz2D的API是純C語(yǔ)言的,它...
    Mario_ZJ閱讀 599評(píng)論 0 1
  • 什么是Quartz 2D 1>Quartz 2D是一個(gè)二維繪圖引擎,同時(shí)支持iOS和Mac OS X系統(tǒng)(跨平臺(tái),...
    青蔥烈馬閱讀 756評(píng)論 0 3
  • Quartz2D 簡(jiǎn)介 Quartz2D是二維(平面)的繪圖引擎(經(jīng)包裝的函數(shù)庫(kù),方便開(kāi)發(fā)者使用。也就是說(shuō)蘋果幫我...
    iOS_Cqlee閱讀 636評(píng)論 0 2
  • 在iOS上畫(huà)圖主要有3種方法: UIKit, 這是我們最常用的繪圖方法,平時(shí)的UIButton、UIImageVi...
    Hardy_Hu閱讀 943評(píng)論 0 6