Quartz2D

Quartz2D是一個(gè)二維繪圖引擎肤视,同時(shí)支持iOS和Mac系統(tǒng)
功能:

  • 繪制圖形(線條茵汰、三角形赂弓、矩形绑榴、圓、弧等)
  • 繪制文字
  • 繪制\生成圖片
  • 讀取\生成PDF
  • 截圖\裁剪圖片
  • 自定義UI控件

1.圖形上下文
相當(dāng)于現(xiàn)實(shí)中的畫(huà)板盈魁,是一個(gè)CGContextRef類型的數(shù)據(jù)
作用:
- 保存繪圖信息翔怎、繪圖狀態(tài)
- 決定繪制的輸出目標(biāo)
2.利用Quartz2D自定義view

  • 首先,得有圖形上下文杨耙,因?yàn)樗鼙4胬L圖信息赤套,并且決定著繪制到什么地方去
  • 其次,那個(gè)圖形上下文必須跟view相關(guān)聯(lián)珊膜,才能將內(nèi)容繪制到view上面

3.自定義view步驟

  • 新建一個(gè)類容握,繼承自UIView
  • 實(shí)現(xiàn)- (void)drawRect:(cgrect)rect方法,然后在這個(gè)方法中取得跟當(dāng)前view相關(guān)聯(lián)的圖形上下文车柠,繪制相應(yīng)的圖形內(nèi)容唯沮,利用圖形上下文講繪制的所有內(nèi)容渲染顯示到view上面

4.通常在drawRect:(CGRect)rect這個(gè)方法里面繪制圖形脖旱,只有在這個(gè)方法里面才能獲取到跟view的layer相關(guān)聯(lián)的圖形上下文,當(dāng)這個(gè)view要顯示的時(shí)候才會(huì)調(diào)用此方法繪制圖形介蛉,一般只調(diào)用一次

5.畫(huà)一條簡(jiǎn)單的線

  • 方法一
// 注意:rect是當(dāng)前控件的bounds
- (void)drawRect:(CGRect)rect {
    // 1.獲取圖像上下文
    // 目前我們所用的上下文都是UIGraphics開(kāi)頭的
    // CGContextRef Ref:引用 CG:目前使用到的類型和函數(shù)一般都是CG開(kāi)頭 CoreGraphics
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
    // 2.描述路徑
    // 創(chuàng)建路徑
    CGMutablePathRef path = CGPathCreateMutable();
    // 設(shè)置起點(diǎn)
    // path:給哪個(gè)路徑設(shè)置起點(diǎn)
    CGPathMoveToPoint(path, NULL, 50, 50);
    // 添加一根線到某個(gè)點(diǎn)
    CGPathAddLineToPoint(path, NULL, 200, 200);
    
    // 3.把路徑添加到上下文
    CGContextAddPath(ctx, path);
    
    // 4.渲染上下文
    CGContextStrokePath(ctx);
}
  • 方法二
- (void)drawRect:(CGRect)rect {
    // 1.獲取圖像上下文
    // 目前我們所用的上下文都是UIGraphics開(kāi)頭的
    // CGContextRef Ref:引用 CG:目前使用到的類型和函數(shù)一般都是CG開(kāi)頭 CoreGraphics
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
    // 2.描述路徑
    // 設(shè)置起點(diǎn)
    CGContextMoveToPoint(ctx, 50, 50);
    // 設(shè)置某個(gè)線從某個(gè)點(diǎn)(里面封裝了添加到上下文的代碼)
    CGContextAddLineToPoint(ctx, 200, 200);
    
    // 3.渲染上下文
    CGContextStrokePath(ctx);
}
  • 方法三
- (void)drawRect:(CGRect)rect {
    // 貝瑟爾路徑
    // 創(chuàng)建路徑
    UIBezierPath *path = [UIBezierPath bezierPath];
    
    // 設(shè)置起點(diǎn)
    [path moveToPoint:CGPointMake(50, 50)];
    
    // 添加一根線到某個(gè)點(diǎn)
    [path addLineToPoint:CGPointMake(200, 200)];
    
    // 繪制路徑
    [path stroke];
}

6.基本圖形繪制(形狀)
廢話不多說(shuō)萌庆,一樣的原理,直接上代碼

  • 方法一
- (void)drawCtxState1
{
    // 獲取上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
    // 描述路徑
    CGContextMoveToPoint(ctx, 50, 50);
    
    CGContextAddLineToPoint(ctx, 100, 50);
    
    // 設(shè)置起點(diǎn)
    CGContextMoveToPoint(ctx, 80, 60);
    
    // 如果不重新設(shè)置起點(diǎn)币旧,默認(rèn)下一根線的起點(diǎn)是上一根線的終點(diǎn)
    CGContextAddLineToPoint(ctx, 100, 200);
    
    // 設(shè)置繪圖狀態(tài), 一定要在渲染之前
    // 顏色
    [[UIColor greenColor] setStroke];
    // 線寬
    CGContextSetLineWidth(ctx, 5);
    // 設(shè)置連接樣式(kCGLineJoinRound 圓角践险, kCGLineJoinMiter直角, kCGLineJoinBevel正切 缺一個(gè)角)
    CGContextSetLineJoin(ctx, kCGLineJoinRound);
    // 設(shè)置頂角樣式
    CGContextSetLineCap(ctx, kCGLineCapRound);
    
    // 渲染上下文
    CGContextStrokePath(ctx);
}
  • 方法二

- (void)drawCtxState2
{
    UIBezierPath *path = [UIBezierPath bezierPath];
    [path moveToPoint:CGPointMake(50, 50)];
    [path addLineToPoint:CGPointMake(200, 200)];
    path.lineWidth = 5;
    [[UIColor redColor] set];
    [path stroke];
    
    UIBezierPath *path1 = [UIBezierPath bezierPath];
    [path1 moveToPoint:CGPointMake(0, 0)];
    [path1 addLineToPoint:CGPointMake(30, 60)];
    [[UIColor greenColor] set];
    path1.lineWidth = 5;
    [path1 stroke];
}

7.繪制曲線


- (void)drawRect:(CGRect)rect {
    // Drawing code
    
    // 如何繪制曲線
    // 原聲繪制方法
    
    // 獲取上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    // 描述路徑
    // 設(shè)置起點(diǎn)
    CGContextMoveToPoint(ctx, 100, 100);
    // cpx:控制點(diǎn)的x  
    CGContextAddQuadCurveToPoint(ctx, 150, 50, 250, 50);
    
    // 渲染上下文
    CGContextStrokePath(ctx);
}

cpx:控制點(diǎn)的x 這個(gè)點(diǎn)就相當(dāng)于一條直線吹菱,拿住中點(diǎn)往任意方向拽巍虫,最后落下的那個(gè)點(diǎn)就是這個(gè)cpx 如果這樣說(shuō)還不懂的話,其實(shí)我也是沒(méi)有辦法?? (配合下面的圖一起理解鳍刷,如果還是不懂占遥,可以留言給我)


Paste_Image.png

8.圓角矩形

- (void)drawRect:(CGRect)rect {
    // Drawing code
    
    // 圓角矩形
//    UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(20, 20, 200, 200) cornerRadius:10];
  
    [path stroke];
    // 填充:必須是一個(gè)完整的封閉路徑, 默認(rèn)會(huì)自動(dòng)關(guān)閉路徑
//    [path fill];
   
}

9.圓弧&扇形


- (void)drawRect:(CGRect)rect {
    // Drawing code

    // 圓弧
    // center:圓心
    // startAngle:弧度 M_PI:180度 clockwise:yes是順時(shí)針 no逆時(shí)針
    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(150, 250) radius:100 startAngle:0 endAngle:M_PI * 2 clockwise:YES];

    [[UIColor purpleColor] set];
    
    // 扇形
    CGPoint center = CGPointMake(150, 250);
    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:100 startAngle:0 endAngle:M_PI_2 clockwise:YES];
    // 添加一根線到圓心
    [path addLineToPoint:center];
    // 封閉路徑,關(guān)閉路徑输瓜,從路徑的終點(diǎn)到起點(diǎn)
    [path closePath];
    
    [path stroke];
    // 填充:必須是一個(gè)完整的封閉路徑, 默認(rèn)會(huì)自動(dòng)關(guān)閉路徑
//    [path fill];

}

掌握了以上的基礎(chǔ)畫(huà)法瓦胎,就可以畫(huà)出餅圖, 柱形圖尤揣,加載框等效果搔啊。

根據(jù)進(jìn)度條控制加載的數(shù)據(jù)


Paste_Image.png

餅圖


Paste_Image.png

10.繪制文字


- (void)drawRect:(CGRect)rect {
    // Drawing code
    
    // 繪制文字
    NSString *str = @"louise";
    
    // 文字的起點(diǎn)
    // Attributes 文本屬性
    
    NSMutableDictionary *textDic = [NSMutableDictionary dictionary];
    
    // 設(shè)置文字顏色等屬性
    textDic[NSForegroundColorAttributeName] = [UIColor redColor];
    textDic[NSFontAttributeName] = [UIFont systemFontOfSize:50];
    
    // 設(shè)置文字的空心顏色和寬度
    textDic[NSStrokeWidthAttributeName] = @3;
    textDic[NSStrokeColorAttributeName] = [UIColor yellowColor];
    
    // 創(chuàng)建陰影對(duì)象
    NSShadow *shadow = [[NSShadow alloc] init];
    shadow.shadowColor = [UIColor purpleColor];
    shadow.shadowOffset = CGSizeMake(10, 10);
    shadow.shadowBlurRadius = 5;
    textDic[NSShadowAttributeName] = shadow;
    
    // 富文本,給普通的文字添加顏色北戏,字體大小
    [str drawAtPoint:CGPointZero withAttributes:textDic];
    
    
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末负芋,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子嗜愈,更是在濱河造成了極大的恐慌旧蛾,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蠕嫁,死亡現(xiàn)場(chǎng)離奇詭異锨天,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)拌阴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)奶镶,“玉大人迟赃,你說(shuō)我怎么就攤上這事〕д颍” “怎么了纤壁?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)捺信。 經(jīng)常有香客問(wèn)我酌媒,道長(zhǎng)欠痴,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任秒咨,我火速辦了婚禮喇辽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘雨席。我一直安慰自己菩咨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布陡厘。 她就那樣靜靜地躺著抽米,像睡著了一般。 火紅的嫁衣襯著肌膚如雪糙置。 梳的紋絲不亂的頭發(fā)上云茸,一...
    開(kāi)封第一講書(shū)人閱讀 51,190評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音谤饭,去河邊找鬼标捺。 笑死,一個(gè)胖子當(dāng)著我的面吹牛网持,可吹牛的內(nèi)容都是我干的宜岛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼功舀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼萍倡!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起辟汰,我...
    開(kāi)封第一講書(shū)人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤列敲,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后帖汞,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體戴而,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年翩蘸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了所意。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡催首,死狀恐怖扶踊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情郎任,我是刑警寧澤秧耗,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站舶治,受9級(jí)特大地震影響分井,放射性物質(zhì)發(fā)生泄漏车猬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一尺锚、第九天 我趴在偏房一處隱蔽的房頂上張望珠闰。 院中可真熱鬧,春花似錦缩麸、人聲如沸铸磅。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)阅仔。三九已至,卻和暖如春弧械,著一層夾襖步出監(jiān)牢的瞬間八酒,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工刃唐, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留羞迷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓画饥,卻偏偏與公主長(zhǎng)得像衔瓮,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子抖甘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

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

  • 什么是Quartz2D 是一個(gè)二維的繪圖引擎,同時(shí)支持iOS和Mac系統(tǒng) Quartz2D的API是純C語(yǔ)言的,它...
    Mario_ZJ閱讀 583評(píng)論 0 1
  • Quartz2D以及drawRect的重繪機(jī)制字?jǐn)?shù)1487 閱讀21 評(píng)論1 喜歡1一热鞍、什么是Quartz2D Q...
    PurpleWind閱讀 771評(píng)論 0 3
  • 什么是Quartz 2D 1>Quartz 2D是一個(gè)二維繪圖引擎,同時(shí)支持iOS和Mac OS X系統(tǒng)(跨平臺(tái),...
    青蔥烈馬閱讀 747評(píng)論 0 3
  • Quartz2D 簡(jiǎn)介 Quartz2D是二維(平面)的繪圖引擎(經(jīng)包裝的函數(shù)庫(kù),方便開(kāi)發(fā)者使用衔彻。也就是說(shuō)蘋(píng)果幫我...
    iOS_Cqlee閱讀 632評(píng)論 0 2
  • 簡(jiǎn)述: 1薇宠、Quartz2D是什么Quartz2D是二維繪圖引擎,同時(shí)支持IOS和Mac 2艰额、Quartz2D能做...
    LitterL閱讀 641評(píng)論 0 6