iOS基础-图形绘制简单总结--Quartz2D

二十四桥明月夜,玉人何处教吹箫!<大岩蛇>

Quartz2D 基础知识:

  • Quartz2D 是一个二维的绘图引擎, 同时支持 iOS 环境 和 Mac OS环境
  • 可以使用Quartz 2D API来实现许多功能,如基本路径的绘制、透明度、描影、绘制阴影、透明层、颜色管理、反锯齿、PDF文档生成和PDF元数据访问。在需要的时候,Quartz 2D还可以借助图形硬件的功能。
  • 在Mac OS X中,Quartz 2D可以与其它图形图像技术混合使用,如Core Image、Core Video、OpenGL、QuickTime。例如,通过使用 QuickTime的GraphicsImportCreateCGImage函数,可以用 Quartz从一个 QuickTime图形导入器中创建一个图像。

关键的概念:

图形上下文 (Graphics Context) : 是 CGContextRef 类型的数据.
作用:
① 保存绘画信息, 绘图状态.
② 决定绘制的输出目标 (绘制到什么地方)
(输出目标可以是 PDF)
过程: 绘制好图形 --> 保存 --> 通过图形上下文 --> 显示 --> 输出目标


在同一个绘图序列里面, 指定不同的图形上下文, 可以将所绘制的图像绘制到不同的目标上面

  • 在 Quartez2D 里, 提供了几种 Graphics Context
    ① Bitmap Graphics Context
    ② PDF Graphics Context
    ③ Window Graphics Context
    ④ Layer Graphics Context
    ⑤ Printer Graphics Context

UIBezierPath 基础 概念:

1: UIBezierPath 对象, 是对CGPathRef 数据类型的封装, path 如果是基于矢量图(面向对象图像或者是绘图图像, 一系列由线连接起来的点)的, 都用直线或者曲线去创建
2: 我们使用直线去创建矩形和多边形, 使用曲线段创建弧形, 圆形 或者 其他复杂曲线形状
3: 每一段都包括一个,或者多个点
4: 每一个直线段或者曲线段的结束的地方, 是下一个开始的地方
5: 每一个连接的直线段或者曲线段的集合, 称为 subPath
6: 一个 UIBezierPath 对象定义一个完整的路径, 包括一个或者多个 subPath
7: 创建 Path 对象和使用 Path 对象的过程是分开的, 创建 Path 是第一步,包含了以下几个步骤:
① 创建一个 Path 对象
② 使用 moveToPoint: 设置出线段的起点


  • 自定义 UI 控件关键:

如何利用 Quartz2D 自定义 UI 控件 ?

如何利用 Quartz2D 绘制东西到 UIView 上面 ?

① 首先, 得有图像上下文, 因为它能保存图形绘制信息, 并且决定绘制到什么地方
② 其次, 图形上下文必须跟 View 相关联, 才能将内容绘制到 UIView 上面

  • 自定义 UI 控件步骤简析

① 创建一个 View 继承于 UIView
② 实现
- (void)drawRect:(CGRect)rect { } 方法,然后在这个方法中, 可以:
2.1 获取跟当前 View 相关联的图像上下文
2.2 绘制相应的图形内容, 绘制时产生的线条, 称为路径 ---> 是一个或者多个, 直线段或者曲线段组成
2.3 利用图形上下文绘制的所有内容, 渲染显示到 View 上面
2.4 利用 UIKit 封装的绘图函数直接绘图


  • 绘画的内容方法写在drawRect:(CGRect)rect方法里面绘图, 才能绘制到 view 上面

因为drawRect:(CGRect)rect方法里面, 可以获取到跟 View 相关联的图像上下文

  • drawRect:(CGRect)rect方法, 的调用时机

① 当 View 第一次显示到屏幕上的时候 (被加载到 UIWindow 上显示出来的时候)
② 调用 view 的 setNeedsDisplay: 或者 setNeedsDisplayInRect 方法时候


上代码(在自定义的继承与 UIView 的 View 中):

实例1 :利用 UIBezierPath 绘制一个多边形(几个线段组成)
  • 线和多边形是一些简单形状, 我们可以使用 moveToPoint 或 addLineToPoint
  • moveToPoint: 设置我们想要创建形状的起点, 从这个点的开始, 我们可以使用方法 addLineToPoint: 去创建一个形状的线段, 也可以连续的创建 line, 每一个 line 的起点是先前的线段的终点, 终点就是指定的点
实例1: 效果图

第 1 步: 创建 UIBezierPath 实例对象

 [UIBezierPath *path = [UIBezierPath bezierPath];]

第 2 步: 设置最开始的起点

 [path moveToPoint:CGPointMake(100.0f, 100.0f)]

第 3 步: 使用 Line 或者 Curve 去定义一个或者多个 subPath(也就是你要画的路径组成)

[path addLineToPoint:(CGPointMake(100.0f, 200.0f))];
[path addLineToPoint:(CGPointMake(200.0f, 200.0f))];
[path addLineToPoint:(CGPointMake(200.0f, 100.0f))];

第 4 步: 结束路径 封闭图形 这一步不仅结束了 subPath 还可在画多边形时候不用连接最后一个线段

[path closePath];

第 5 步: 我们设置一些属性

   // 线宽
path.lineWidth = 5.0f; 
   // 线条拐角
path.lineCapStyle = kCGLineCapRound;   
   // 终点的处理 
path.lineJoinStyle = kCGLineJoinRound; 
   // 设置线条颜色
[[UIColor orangeColor] set];

第 6 步: 描线 根据坐标连线

[path stroke];

实例2: 用上下文来画 一条直线 和 一条曲线 矩形和圆形可以类推
实例2和3: 效果图展示

直线:

第 1 步: 获取当前图形上下文 (图层), 基本上都是 UIGraphics 框架下的

CGContextRef cxt = UIGraphicsGetCurrentContext();

第 2 步: 创建一个可变路径,用于描述我们想要的路径
// 2.1 创建路径

CGMutablePathRef path = CGPathCreateMutable();

// 2.2 设置起点

 CGPathMoveToPoint(path, NULL, 60, 50);

// 2.3 设置终点

CGPathAddLineToPoint(path, NULL, 200, 200);

<big>第 3 步:</big> 把路径添加到上下文,(用这个上下文去管理这些路径)

CGContextAddPath(cxt, path);

第 4 步: 我们设置一些属性 根据上下文

// 设置线宽
    CGContextSetLineWidth(cxt, 10.0f);
// 设置颜色
    //[[UIColor redColor] set];
    CGContextSetRGBStrokeColor(cxt, 1, 0.6, 0.9, 1);
// 线的样式
    CGContextSetLineCap(cxt, kCGLineCapRound);
// 填充 闭合形状里面的颜色  就是上图里面的红色填充
    [[UIColor greenColor] setFill];
// 描边 线边的颜色
    [[UIColor cyanColor] setStroke];

第 4 步: 渲染 (可以理解就是在路径上进行颜色的填充, 要渲染展示出来)

分开写   
// CGContextStrokePath(cxt); 描边
 //  CGContextFillPath(cxt);  填充

#参数1: 上下文
#参数2:  渲染的方式(枚举值可以点进去看)  这个是 既要描边 又要填充

  CGContextDrawPath(cxt, kCGPathFillStroke);
曲线:

第 1 步: 获取上线文

CGContextRef cxt = UIGraphicsGetCurrentContext();

第 2 步: 创建路径

UIBezierPath *path = [UIBezierPath bezierPath];

// 2.1 设置起点

  [path moveToPoint:(CGPointMake(100, 400))];

// 2.2 设置终点(曲线)

#参数1: CurveToPoint 第一个点是  这个曲线的终点
#参数 2 和 3 : controlPoint 就是控制弧度的点, 可以理解在控制点会控制如何出现圆弧(圆弧切线交点), 从而让整体变得圆润呈弧形  试试就明白了
[path addCurveToPoint:(CGPointMake(300, 400)) controlPoint1:(CGPointMake(150, 550)) controlPoint2:(CGPointMake(250, 550))];

第 3 步 : 添加到上下文上

 CGContextAddPath(cxt, path.CGPath);
//  这是设置填充颜色
[[UIColor redColor] setFill];

第 4 步 : 渲染

CGContextDrawPath(cxt, kCGPathFillStroke);

实例 4 :圆形 扇形
实例4: 效果图

这个方法 是把正方形切成圆形

     // 1: 创建上下文
CGContextRef ref = UIGraphicsGetCurrentContext();
    //  2:描述路径
        // 2.1 创建描述路径   
( #参数1:要切的矩形 
  #参数2: cornerRadius 切角半径    )
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:(CGRectMake(100, 100, 100, 100)) cornerRadius:50];
    
    //  3: 添加上下文
CGContextAddPath(ref, path.CGPath);
    [[UIColor redColor] setFill];
    //  4: 渲染
CGContextDrawPath(ref, kCGPathFillStroke);

控制路径画扇形

// 上下文
CGContextRef ref = UIGraphicsGetCurrentContext();
// 建路径

  #参数1: bezierPathWithArcCenter:<#(CGPoint)#>  圆弧中心点
  #参数2: radius:<#(CGFloat)#>  半径
  #参数3: startAngle:<#(CGFloat)#>  起始角度
  #参数4: endAngle:<#(CGFloat)#> 结束角度
  #参数5: clockwise:<#(BOOL)#>] 是否顺时针
  

    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:self.center radius:200 startAngle:0 endAngle:0.5*M_PI clockwise:1];
// 这两个路径是为了让圆弧和中心连接  形成闭合图形
    [path addLineToPoint:self.center];
     [path addLineToPoint:(CGPointMake(self.center.x + 200, self.center.y))];
// 填充的颜色
   [[UIColor redColor] setFill];
// 上下文添加
 CGContextAddPath(ref, path.CGPath);
// 渲染
 CGContextDrawPath(ref, kCGPathFillStroke);

还可以实现的效果点击有相应的简介:

刮刮乐

刮开涂层效果

计时进度条效果

计时进度条效果.gif

简易画板效果

简易画板效果

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

推荐阅读更多精彩内容

  • --绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益...
    韩七夏阅读 2,717评论 2 10
  • Core Graphics Framework是一套基于C的API框架,使用了Quartz作为绘图引擎。它提供了低...
    ShanJiJi阅读 1,523评论 0 20
  • 18- UIBezierPath官方API中文翻译(待校对) ----------------- 华丽的分割线 -...
    醉卧栏杆听雨声阅读 1,052评论 1 1
  • 1.原来认知歪曲里面还有这么多门道,这些标签我们父母身上多多少少都有,不管是对自己,还是对家人和孩子。越学越觉得自...
    江西辰妈阅读 2,132评论 0 0
  • 今天对爱情还是蛮多见解的,爱情分几个步骤 一:是相遇 二:两个互相好感的人在一起表白,然后在一起。 三:互相磨练性...
    导演张升志阅读 308评论 0 0