OC绘制基本图形

好了,在之前的两篇文章里面写了Quartz2D的一些基本知识。从这篇开始写一下OC绘制基本图形的方法。

1. UIKit中封装了一些最常用的绘图方法

1.1 矩形

  • 填充 UIRectFill(rect)
  • 画线 UIRectFrame(rect)

1.2 字符串

  • 绘制 [str drawInRect:rect withAttributes:attr];

1.3 图像

  • 拉伸 [image drawInRect:rect]
  • 绘制 [image drawAtPoint:CGPointZero];
  • 平铺 [image drawAsPatternInRect:rect];

2. 贝塞尔路径常用方法列表(BezierPath)

2.1 贝塞尔路径的常用方法列表

2.1.1 构造函数

  • 矩形 bezierPathWithRect
  • 圆角矩形 bezierPathWithRoundedRect:cornerRadius:
  • 椭圆 bezierPathWithOvalInRect:
  • 圆弧 bezierPathWithArcCenter:

2.1.2 路径操作

  • 移动到点 moveToPoint:
  • 添加线 addLineToPoint:
  • 添加曲线 addCurveToPoint:
  • 关闭路径 closePath
  • 追加路径 appendPath:

2.1.3 绘图方法

  • 填充 fill
  • 描边 stroke
  • 剪切 addClip

2.2 画线段

  • 线头样式及交叉线样式
线头样式及交叉线样式.png
- (void)drawRect:(CGRect)rect {
    //    创建路径
    UIBezierPath *path = [UIBezierPath bezierPath];
    
    //    移动到起点
    [path moveToPoint:CGPointMake(10, 10)];
    
    //    添加线段到终点
    [path addLineToPoint:CGPointMake(90, 90)];
    
    [path moveToPoint:CGPointMake(90, 10)];
    [path addLineToPoint:CGPointMake(10, 90)];
    
    //    设置线宽
    path.lineWidth = 10.0f;
    
    //    设置线头样式
    path.lineCapStyle = kCGLineCapRound;
    
    //    设置线交叉样式
    path.lineJoinStyle = kCGLineJoinMiter;
    
    //    渲染
    [path stroke];
}

2.3 画圆角矩形,也可以用这种方式画圆

- (void)drawRect:(CGRect)rect {
    //    创建路径
    //    参数1:矩形的左上角圆点及矩形的宽高。参数2:矩形圆角的半径
    UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(10, 10, 80, 80) cornerRadius:10];
    
    
    //    渲染
    [path stroke];
}

2.4 画椭圆,根据这种方法也可以画圆

  • 画出来的也是矩形的内切椭圆
- (void)drawRect:(CGRect)rect {
    UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(10, 10, 90, 30)];
    
    [path stroke];
}

2.5 画扇形,并进行填充。利用这种方法也可以画圆

  • 在渲染的时候,会自动关闭路径。
- (void)drawRect:(CGRect)rect {
    //    绘制扇形。参数:1,圆点坐标。参数2:半径。参数3+4,起点和终点的弧度。参数5:YES表示顺时针,NO表示逆时针。
    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(50, 50) radius:30 startAngle:0 endAngle:M_PI_2 clockwise:YES];
    
    //连接圆心
    [path addLineToPoint:CGPointMake(50, 50)];
    
    //    渲染
    [path fill];
}

2.6 绘制文字

- (void)drawRect:(CGRect)rect {
    //    准备文字
    NSString *str = @"今天天气不错,挺风和日丽的";
    //    设置文字属性:字号为12,颜色为灰色,描边宽度为10
    NSDictionary *attriStr = @{NSFontAttributeName:[UIFont systemFontOfSize:12.0],NSForegroundColorAttributeName:[UIColor grayColor],NSStrokeWidthAttributeName:@10
                               };
    
    //    绘制方式一:在限定的rect范围内进行绘制,文字会自动换行
    [str drawInRect:CGRectMake(0, 0, 45, 100) withAttributes:attriStr];
    
    //    绘制方式二:从指定的点开始绘制。超出view 的区域就不再显示了。
    [str drawAtPoint:CGPointMake(0, 45) withAttributes:attriStr];
    
}

2.7 绘制图片

  1. 使用drawInrect进行绘制
    图片比区域小,就会拉伸;图片比区域大,就会压缩。

  2. 使用drawAtPoint进行绘制
    有多大就绘制多大,不做任何压缩、拉伸

  3. 使用drawAsPatten进行绘制
    如果图片比区域小,会进行平铺;如果图片比区域大,有多少绘制多少

- (void)drawRect:(CGRect)rect {
    UIImage *image = [UIImage imageNamed:@"image"];
    //    方式一:
    [image drawInRect:CGRectMake(10, 10, 50, 50)];
    //    方式二:
    [image drawAtPoint:CGPointMake(55, 55)];
    //    方式三:
    [image drawAsPatternInRect:CGRectMake(50, 50, 100, 100)];
    
}

3. 保存屏幕截图,并存储至相册

  • 开启一个图形的context。开启就别忘了关闭。
  • iOS8.0 以后还需要获得用户许可的权限。之前的iOS不需要。
  • 在plist中设置申请用户许可时的提示文字。
/**
 保存图片事件
 
 @param sender 保存按钮
 */
- (IBAction)savePicture:(id)sender {
    
    //    开启图片context。参数1:context的大小。参数2:是否不透明。参数三:缩放比,0 表示当前屏幕的缩放比    UIGraphicsBeginImageContextWithOptions(self.patinView.bounds.size, NO, 0);
    
    //    获取图片的范围
    [self.patinView drawViewHierarchyInRect:self.patinView.bounds afterScreenUpdates:YES];
    
    //    从context获取图片
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    
    //    结束context,开启一定要结束
    UIGraphicsEndImageContext();
    
    //    将图片保存至照片库
    UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
    
}

//系统指定的保存后结束要执行的方法
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{
    
}
系统指定的保存后结束要执行的方法.png

OS8.0 之后,访问相册,给出提示文字。

访问相册,给出提示文字.png

接下来,会分享如何使用OC绘制饼状图、柱状图和扇形图。以及如何使用它们来绘制动态的进度条等等

在此之前,分享了一些关于绘图方面的基础。可以通过传输门快捷进入:

1.绘图系列之:使用Quartz2D进行绘图

2.绘图系列之:Quartz2D进行渲染

3.绘图系列之:OC绘制基本图形

4.绘图系列之:OC绘制饼状图、柱状图和扇形图

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • Quartz2D以及drawRect的重绘机制字数1487 阅读21 评论1 喜欢1一、什么是Quartz2D Q...
    PurpleWind阅读 760评论 0 3
  • --绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益...
    韩七夏阅读 2,708评论 2 10
  • 什么是Quartz2D 是一个二维的绘图引擎,同时支持iOS和Mac系统 Quartz2D的API是纯C语言的,它...
    Mario_ZJ阅读 574评论 0 1
  • 一、使用UIImage和CGImage处理图位 可用通过Quartz的图片对象或原始图片数据来创建UIImage。...
    MD_963阅读 1,576评论 0 3
  • 你好,躺在宿舍床上的自己。我写这一段文字不是为了能激励你什么,只是想给你留下点什么,当你看着教室黑板旁的倒计时牌上...
    LIJANG阅读 292评论 0 1