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