iOS 開發(fā)--使用Quartz 2D繪制各種圖形

iOS中常用的繪圖框架是:Quartz 2D啦膜,他是Core Graphics框架的一部分。而Core Graphics是基于C語言的一套框架淌喻,所以其中很多方法是以CG開頭僧家,枚舉類型則是以k開頭。Quartz 2D可以實現(xiàn)很多功能裸删,如:基于路徑的繪圖八拱、透明度、陰影涯塔、顏色管理肌稻、反鋸齒、PDF文檔生成和PDF元數(shù)據(jù)訪問等伤塌。

** 注意: 下面這些方法要寫在:-(void)drawRect:(CGRect)rect**這個方法中灯萍。因為在這個方法中我們才能獲得圖形上下文:CGContextRef。圖形上下文每聪,類似于一塊畫布旦棉,可以在上面進行繪畫操作。繪制完成后药薯,將畫布放到我們的view中顯示绑洛。

一、畫線

第一種方法
  //畫線 第一種方法
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetRGBStrokeColor(context, 0.2, 0.2, 0.2, 1);
    CGContextSetLineWidth(context, 10);
    CGContextSetLineCap(context, kCGLineCapSquare);
    CGContextMoveToPoint(context, 20, 64);
    CGContextAddLineToPoint(context, 90, 64);
    CGContextStrokePath(context);
第二種方法
  //畫線 第二種方法
   CGContextRef context = UIGraphicsGetCurrentContext();
    CGPoint apoints[2];
    apoints[0] = CGPointMake(100, 64);
    apoints[1] = CGPointMake(160, 64);
    CGContextAddLines(context, apoints, 2);
    CGFloat components[] = {221.0/255,221.0/255,221.0/255,1.0f};
    CGContextSetStrokeColor(context, components);
    CGContextSetLineWidth(context, 3);
    CGContextDrawPath(context, kCGPathStroke);
第三種方法
   //創(chuàng)建一條繪圖的路徑
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path, NULL, 180, 20);
    CGPathAddLineToPoint(path, NULL, 260, 20);
    CGContextSetLineWidth(context, 6);
    CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);
    //把路徑添加到上下文中
    CGContextAddPath(context, path);
    //渲染
    CGContextStrokePath(context);

效果圖如下:

直線效果圖.png

二童本、畫矩形

第一種方法
 // 畫長方形
    CGContextSetRGBStrokeColor(context, 1, 0, 0, 1);
    CGContextSetFillColorWithColor(context, [UIColor purpleColor].CGColor);
    CGContextSetLineWidth(context, 5);
    CGContextAddRect(context, CGRectMake(20, 20, 150, 80));
    CGContextStrokePath(context);
第二種方法
   // 第二種方法
    CGContextSetFillColorWithColor(context, [UIColor grayColor].CGColor);
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathAddRect(path, NULL, CGRectMake(180, 20, 60, 100));
    CGContextSetLineWidth(context, 10);
    CGContextSetLineJoin(context, kCGLineJoinRound);
    CGContextSetStrokeColorWithColor(context, [UIColor yellowColor].CGColor);
  
    CGContextAddPath(context, path);
    CGContextStrokePath(context);
第三種方法
 //第三種方法
    CGContextSetFillColorWithColor(context, [UIColor orangeColor].CGColor);
    CGContextSetLineWidth(context, 2);//線的寬度
    CGContextStrokeRect(context, CGRectMake(250, 20, 60, 80));
    CGContextFillRect(context, CGRectMake(260, 30, 40, 60));
   
    CGContextDrawPath(context, kCGPathFillStroke);

效果圖:

矩形效果圖.png

三真屯、畫圓形

第一種方法
  //第一種方法
    CGContextSetFillColorWithColor(context, [UIColor lightGrayColor].CGColor);
    CGContextSetLineWidth(context, 6);
    CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor);
     //x,y為圓點坐標(biāo),radius半徑 startAngle為開始的弧度穷娱,endAngle為 結(jié)束的弧 clockwise 0為順時針绑蔫,1為逆時針。
    CGContextAddArc(context, 60, 60, 50, 0, M_PI*2, 0);
    CGContextDrawPath(context, kCGPathFillStroke);
第二種方法
 //第二種方法

    CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor);
    CGContextSetLineWidth(context, 2);
    CGMutablePathRef path = CGPathCreateMutable();
     //x,y為圓點坐標(biāo)泵额,radius半徑 startAngle為開始的弧度配深,endAngle為 結(jié)束的弧 clockwise 0為順時針,1為逆時針嫁盲。
    CGPathAddArc(path, NULL, 190, 80, 60, 0, M_PI*0.3, 1);
    CGContextAddPath(context, path);
    CGContextDrawPath(context, kCGPathFillStroke);
效果圖.png

四篓叶、繪制貝塞爾曲線

//    Quartz2D繪制曲線分為兩種, 一個是二次貝塞爾曲線, 還有一個是三次貝塞爾曲線, 貝塞爾曲線需要起始點, 終止點 和控制點 ,   二次貝塞爾曲線只有一個控制點,三次貝塞爾曲線是有兩個控制點
    //繪制貝塞爾曲線
    CGContextMoveToPoint(context, 40, 100);
    CGContextAddQuadCurveToPoint(context, 160, 0, 300, 100);
    CGContextSetStrokeColorWithColor(context, [UIColor yellowColor].CGColor);
    CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor);
    CGContextSetLineWidth(context, 5);
    CGContextDrawPath(context, kCGPathFillStroke);
    
    CGContextMoveToPoint(context, 30, 200);
//    繪制三次貝塞爾曲線
//    第一個參數(shù) : 第一個控制點的坐標(biāo)位置
//    第二個參數(shù) : 第二個控制點的坐標(biāo)位置
//    第三個參數(shù) : 終止點的坐標(biāo)
    CGContextAddCurveToPoint(context, 100, 200, 200, 500, 300, 300);
    CGContextSetStrokeColorWithColor(context, [UIColor orangeColor].CGColor);
    CGContextSetFillColorWithColor(context, [UIColor purpleColor].CGColor);
    CGContextSetLineWidth(context, 3);
    CGContextDrawPath(context, kCGPathFillStroke);
貝塞爾曲線.png

四、繪制圖片

 //繪制圖片
    UIImage *image = [UIImage imageNamed:@"qiu.jpg"];
     //1.繪制到指定的矩形中羞秤,注意如果大小不合適會會進行拉伸
    [image drawInRect:CGRectMake(10, 20, 200, 200)];
    //2.使用這個使圖片上下顛倒了
    CGContextDrawImage(context, CGRectMake(230, 60, 70, 70), image.CGImage);
    //3.從某一點開始繪制
    [image drawAtPoint:CGPointMake(20, 240)];

效果圖如下:


繪制圖片.png

五缸托、繪制文字

在講述繪制文字的時候,先總結(jié)一下有關(guān)富文本的東西瘾蛋。

屬性名字 屬性意義 屬性參數(shù)
NSFontAttributeName 字號 UIFont 默認(rèn)12
NSForegroundColorAttributeName 字體顏色 UIColor俐镐,默認(rèn)黑色
NSBackgroundColorAttributeName 背景顏色 UIColor
NSStrikethroughStyleAttributeName 刪除線格式 1或0
NSStrikethroughColorAttributeName 刪除線顏色 UIColor
NSStrokeWidthAttributeName 邊線寬度 NSNumber 對象(小數(shù))
NSStrokeColorAttributeName 邊線顏色 UIColor
NSUnderlineStyleAttributeName 下劃線 例如:NSUnderlineStyleSingle
NSUnderlineColorAttributeName 下劃線顏色 UIColor
NSShadowAttributeName 陰影 NSShawdow
NSExpansionAttributeName 設(shè)置文本扁平化 NSNumber
NSObliquenessAttributeName 字形傾斜 NSNumber (float),正值右傾,負值左傾
NSKernAttributeName 字符間距 NSNumber (float)正值加寬哺哼,負值變窄
NSLinkAttributeName 鏈接 NSURL (preferred) or NSString
NSAttachmentAttributeName 設(shè)置文本附件 NSTextAttachment對象,常用于文字圖片混排
NSParagraphStyleAttributeName 文本段落格式 NSParagraphStyle 對象
NSBaselineOffsetAttributeName 基準(zhǔn)線偏移 NSNumber 對象

繪制文字的代碼:

    //繪制文字
    NSMutableParagraphStyle *style=[[NSMutableParagraphStyle alloc]init];//段落樣式
    NSTextAlignment align=NSTextAlignmentLeft;//對齊方式
    style.alignment=align;
    style.firstLineHeadIndent = 20.f;//首行縮進
    style.lineSpacing = 10;// 字體的行間距
    /*
     刪除線的樣式:NSUnderlineStyleNone 不設(shè)置刪除線
                NSUnderlineStyleSingle 設(shè)置刪除線為細單實線
                NSUnderlineStyleThick 設(shè)置刪除線為粗單實線
                NSUnderlineStyleDouble 設(shè)置刪除線為細雙實線
     刪除線和下劃線使用相同的枚舉常量作為其屬性值
     */
    NSDictionary *attributeDict = @{NSFontAttributeName:[UIFont systemFontOfSize:16],NSForegroundColorAttributeName:[UIColor blueColor],NSParagraphStyleAttributeName:style,NSUnderlineStyleAttributeName:@(NSUnderlineStyleSingle),NSUnderlineColorAttributeName:[UIColor greenColor],NSStrikethroughStyleAttributeName:@(NSUnderlineStyleSingle),NSStrikethroughColorAttributeName:[UIColor redColor],NSExpansionAttributeName:@1,NSObliquenessAttributeName:@0};
    [@"貝塞爾曲線是由法國數(shù)學(xué)家“貝塞爾”發(fā)現(xiàn)的佩抹,他發(fā)現(xiàn):任何一條曲線都能夠由和它相切的直線的兩個端點來描述奇唤,這種曲線表示方式后來被廣泛應(yīng)用到計算機中,稱為“貝塞爾曲線”01" drawInRect:CGRectMake(20, 60, 200,400) withAttributes:attributeDict];

效果圖如下:

文字繪制效果圖.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末匹摇,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子甲葬,更是在濱河造成了極大的恐慌廊勃,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件经窖,死亡現(xiàn)場離奇詭異坡垫,居然都是意外死亡,警方通過查閱死者的電腦和手機画侣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進店門冰悠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人配乱,你說我怎么就攤上這事溉卓。” “怎么了搬泥?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵桑寨,是天一觀的道長。 經(jīng)常有香客問我忿檩,道長尉尾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任燥透,我火速辦了婚禮沙咏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘班套。我一直安慰自己肢藐,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布孽尽。 她就那樣靜靜地躺著窖壕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪杉女。 梳的紋絲不亂的頭發(fā)上瞻讽,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天,我揣著相機與錄音熏挎,去河邊找鬼速勇。 笑死,一個胖子當(dāng)著我的面吹牛坎拐,可吹牛的內(nèi)容都是我干的烦磁。 我是一名探鬼主播养匈,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼都伪!你這毒婦竟也來了呕乎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤陨晶,失蹤者是張志新(化名)和其女友劉穎猬仁,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體先誉,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡湿刽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了褐耳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诈闺。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖铃芦,靈堂內(nèi)的尸體忽然破棺而出雅镊,到底是詐尸還是另有隱情,我是刑警寧澤杨帽,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布漓穿,位于F島的核電站,受9級特大地震影響注盈,放射性物質(zhì)發(fā)生泄漏晃危。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一老客、第九天 我趴在偏房一處隱蔽的房頂上張望僚饭。 院中可真熱鬧,春花似錦胧砰、人聲如沸鳍鸵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽偿乖。三九已至,卻和暖如春哲嘲,著一層夾襖步出監(jiān)牢的瞬間贪薪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工眠副, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留画切,地道東北人。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓囱怕,卻偏偏與公主長得像霍弹,于是被迫代替她去往敵國和親毫别。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,922評論 2 361

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