整理一下CoreGraphic和Quartz2D的知识(二)

原文传送门

利用Quartz2D绘图的基本步骤

  1. 获取与视图相关联的上下文对象
    –UIGraphicsGetCurrentContext
  2. 创建及设置路径 (path)
    –2.1 创建路径
    –2.2 设置路径起点
    –2.3 增加路径内容……
  3. 将路径添加到上下文
  4. 设置上下文属性
    –边线颜色、填充颜色、线宽、线段连接样式、线段首尾样式、虚线样式…
  5. 绘制路径
  6. 释放路径
    什么是路径?
    •路径定义了一条或者或多条形状或子路径
    •子路径可以包含一条或者多条直线或曲线
    •子路径也可以是一些简单的形状,例如线、圆形、矩形或者星型等
    •子路径还可以包含复杂的形状,例如地图轮廓或者涂鸦等
    •路径可以是开放的,也可以是封闭的;对于封闭路径可以空心的也可以是实心的
    下面写一些代码来看看效果~,注意下面写的函数需要在UIView类及其子类的drawRect:方法中调用,原因见上一篇
#pragmamark 绘制一条直线
- (void)drawLine{
    //1. 获取当前图形上下文,就是要绘制到屏幕 
   CGContextRef context =UIGraphicsGetCurrentContext();
   //2. 设置路径CGMutablePathRef path =CGPathCreateMutable();
   //1) 移动到某一个点CGPathMoveToPoint(path, NULL,100,100);
   //2) 增加一条直线CGPathAddLineToPoint(path, NULL,200,200);
   //3. 将路径添加到上下文CGContextAddPath(context, path);
   //4. 设置上下文
   //1) 设置线条颜色CGContextSetRGBStrokeColor(context,1.0,0.0,0.0,1.0);
   //5. 将上下文中的路径绘制出来CGContextDrawPath(context, kCGPathStroke);
   //6. 释放路径CGPathRelease(path);
}

其实为了方便程序员进行开发,也可以直接使用上下文内置的路径进行绘图而不是用上下文+路径的方法

//1. 获取上下文CGContextRef context =UIGraphicsGetCurrentContext();
//2. 设置上下文中的路径CGContextMoveToPoint(context,100,100);
CGContextAddLineToPoint(context,200,200);
CGContextAddLineToPoint(context,100,200);//CGContextAddLineToPoint(context, 100, 100);
//关闭路径
CGContextClosePath(context);
// 设置边线颜色
[[UIColor redColor] setStroke];
// 设置填充颜色
[[UIColor blueColor] setFill];
// 同时设置边线和填充颜色
[[UIColor greenColor] set];
// 4. 绘制上下文
CGContextDrawPath(context, kCGPathFillStroke);

上面代码中,如果注释的那句打开而CGContextClosePath(context)被注释掉的话,绘画出一个三角形
如果按照上面的代码来,也绘画出一个三角形---{CGContextClosePath(context)的功能是将该上下文目前画出的路径封闭起来}
因为核心图形使用非常频繁,因此UIKit对于常用的绘图做了一定的封装
CGContextDrawPath(context, kCGPathFillStroke);这句语句的第二个参数是指定绘图的模式,可以绘制异或的图像等等.例如如果有一块被path包含了好几次,通过指定模式可以将这一块空出来,下面是集中模式及其解释

填充模式
kCGPathFill 填充绘制,针对关闭的路径使用
kCGPathStroke 绘制线条,无所谓路径是否关闭
kCGPathFillStroke 填充并绘制线条
kCGPathEOFill 异或填充,针对关闭路径使用
kCGPathEOFillStroke 异或填充并画线
下面的代码是画一个矩形

CGRect rect = CGRectMake(100,100,200,200);
[[UIColor redColor]set];
//绘制实心矩形
UIRectFill(rect);
CGRect rect1= CGRectMake(150,150,50,50);
[[UIColor blueColor]set];
//绘制空心举行
UIRectFrame(rect1);

下面的代码是画一个圆形

CGContextRef context =UIGraphicsGetCurrentContext();
//在iOS中,如果要绘制圆形,需要先指定一个矩形//绘制出来的圆形,是内切于该矩形的
//1. 指定绘制圆形外切的矩形
CGRect rect = CGRectMake(100,100,150,150);
//2. 添加圆形到上下文路径
CGContextAddEllipseInRect(context, rect);
//3. 绘制圆形

CGContextDrawPath(context, kCGPathFill);

下面的代码是画质一条弧线

- (void)drawArc
{
CGContextRef context=UIGraphicsGetCurrentContext();
/**
弧线参数:
1)上下文
2) x, y 弧线所在圆上的圆心
3)半径
4) 开始角度、结束角度,0度是圆形最右侧的点
5) 顺时针:0 逆时针:1
*/
CGContextAddArc(context,160,240,100,0, -M_PI_2,0);
//3. 绘制圆形
CGContextDrawPath(context, kCGPathFill);
}

下面的代码是将一张图片以绘制的方式展现在View上

#pragmamark 绘制图像
- (void)drawImage
{
  //提示:绘制的图像,只能看不能交互,相对而言,性能比UIImageView要高
  UIImage *image = [UIImage imageNamed:@"头像1"];
  //1. 在指定坐标绘制//[image drawAtPoint:CGPointMake(80, 80)];
  //2. 在指定区域内拉伸绘制
  //[image drawInRect:CGRectMake(100, 100, 150, 250)];
  //3. 平铺绘制
  [image drawAsPatternInRect:self.bounds];
}

下面的代码是绘制文字,NSString可以直接调用方法,将文字绘制在view上

#pragmamark 绘制文本- (void)drawText
{
NSString*text =@"床前明月光,疑是地上霜!";
UIFont*font = [UIFont systemFontOfSize:17];
NSDictionary*dict =@{NSFontAttributeName: font, NSForegroundColorAttributeName: [UIColor redColor]};
//以下方法在iOS7被废弃
//[text sizeWithFont:font constrainedToSize:CGSizeMake(100, 10000) lineBreakMode:NSLineBreakByCharWrapping];
CGRect rect = [text boundingRectWithSize:CGSizeMake(20,10000) options:NSStringDrawingUsesLineFragmentOrigin attributes:dict context:nil];
rect.origin= CGPointMake(100,20);
//给文本加一个背景颜色
[[UIColor lightGrayColor]set];
UIRectFill(rect);
//在iOS7中,所有文本绘制属性,均需要使用属性字典进行设置!
//[[UIColor redColor] set];
[text drawInRect:rect withAttributes:dict];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容

  • --绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益...
    韩七夏阅读 2,717评论 2 10
  • 本章中迄今为止的绘制实施例中大多会产生一个UIImage对象,主要是通过调用UIGraphicsBeginImag...
    shenzhenboy阅读 1,364评论 0 4
  • Core Graphics Framework是一套基于C的API框架,使用了Quartz作为绘图引擎。它提供了低...
    ShanJiJi阅读 1,523评论 0 20
  • 写微信小程序的时候发现如下代码: new_products: data.filter(product => p...
    huaiOS阅读 7,373评论 0 2
  • 晓梦无心弄素琴, 迷蝶谁又醉花荫。 今年共种芳菲树, 他日同游杏李林。
    點下阅读 133评论 2 6