【原】iOS学习之Quartz2D(1)
什么是Quartz2D
1、Quartz 2D 是一个二维绘图引擎,同时支持iOS和Mac系统
2、Quartz 2D 能完成的工作:
绘制图形 : 线条\三角形\矩形\圆\弧等
绘制文字
绘制\生成图片(图像)
读取\生成PDF
截图\裁剪图片
自定义UI控件
图形上下文
1、图形上下文(Graphics Context):是一个 CGContextRef 类型的数据
2、图形上下文的作用:
保存绘图信息、绘图状态
决定绘制的输出目标(绘制到什么地方去?)
相同的一套绘图序列,指定不同的 Graphics Context,就可将相同的图像绘制到不同的目标上
3、Quartz2D 提供了以下几种类型的 Graphics Context:
BitmapGraphics Context
PDFGraphics Context
WindowGraphics Context
LayerGraphics Context
PrinterGraphics Context
自定义view
1、如何利用 Quartz2D 绘制东西到 view 上?
首先,得有图形上下文,因为它能保存绘图信息,并且决定着绘制到什么地方去
其次,那个图形上下文必须跟view相关联,才能将内容绘制到view上面
2、自定义view的步骤
新建一个类,继承自 UIView
实现 - (void)drawRect:(CGRect)rect 方法,然后在这个方法中
取得跟当前view相关联的图形上下文
绘制相应的图形内容
利用图形上下文将绘制的所有内容渲染显示到view上面
3、为什么要在 drawRect 里面绘图
只有在这个方法里面才能获取到跟 View 的 layer 相关联的图形上下文
当这个View要显示的时候才会调用drawRect绘制图形
注意:rect是当前控件的bounds
画线
1、步骤:
获取图形上下文
描述路径
把路径添加到上下文
渲染上下文
2、直线
方式1:(最原始的绘图方式)
- // 1.获取图形上下文
- // 目前我们所用的上下文都是以UIGraphics
- // CGContextRef Ref:引用 CG:目前使用到的类型和函数 一般都是CG开头 CoreGraphics
- CGContextRef ctx = UIGraphicsGetCurrentContext();
- // 2.描述路径
- // 创建路径
- CGMutablePathRef path = CGPathCreateMutable();
- // 设置起点
- // path:给哪个路径设置起点
- CGPathMoveToPoint(path, NULL, , );
- // 添加一根线到某个点
- CGPathAddLineToPoint(path, NULL, , );
- // 3.把路径添加到上下文
- CGContextAddPath(ctx, path);
- // 4.渲染上下文
- CGContextStrokePath(ctx);
方式2:(原生)
- // 获取上下文
- CGContextRef ctx = UIGraphicsGetCurrentContext();
- // 描述路径
- // 设置起点
- CGContextMoveToPoint(ctx, , );
- CGContextAddLineToPoint(ctx, , );
- // 渲染上下文
- CGContextStrokePath(ctx);
方式3:贝瑟尔路径
- // UIKit已经封装了一些绘图的功能
- // 贝瑟尔路径
- // 创建路径
- UIBezierPath *path = [UIBezierPath bezierPath];
- // 设置起点
- [path moveToPoint:CGPointMake(, )];
- // 添加一根线到某个点
- [path addLineToPoint:CGPointMake(, )];
- // 绘制路径
- [path stroke];
3、线的相关操作
原生
- // 获取上下文
- CGContextRef ctx = UIGraphicsGetCurrentContext();
- // 描述路径
- //起点
- CGContextMoveToPoint(ctx, , );
- CGContextAddLineToPoint(ctx, , );
- // 设置起点
- CGContextMoveToPoint(ctx, , );
- // 默认下一根线的起点就是上一根线终点
- CGContextAddLineToPoint(ctx, , );
- // 设置绘图状态,一定要在渲染之前
- // 颜色
- [[UIColor redColor] setStroke];
- // 线宽
- CGContextSetLineWidth(ctx, );
- // 设置连接样式
- CGContextSetLineJoin(ctx, kCGLineJoinBevel);
- // 设置顶角样式
- CGContextSetLineCap(ctx, kCGLineCapRound);
- // 渲染上下文
- CGContextStrokePath(ctx);
贝瑟尔路径
- UIBezierPath *path = [UIBezierPath bezierPath];
- [path moveToPoint:CGPointMake(, )];
- [path addLineToPoint:CGPointMake(, )];
- // 线宽
- path.lineWidth = ;
- // 颜色
- [[UIColor redColor] set];
- [path stroke];
- UIBezierPath *path1 = [UIBezierPath bezierPath];
- [path1 moveToPoint:CGPointMake(, )];
- [path1 addLineToPoint:CGPointMake(, )];
- [[UIColor greenColor] set];
- path1.lineWidth = ;
- [path1 stroke];
比较:
从代码中可以看出,原生的线操作只能将线绘制为一种样式,但是贝瑟尔路径的对线的操作可以根据路径的不同来绘制不同样式的线条
3、曲线
方式1(原生)
- // 原生绘制方法
- // 获取上下文
- CGContextRef ctx = UIGraphicsGetCurrentContext();
- // 描述路径
- // 设置起点
- CGContextMoveToPoint(ctx, , );
- // CGContextAddQuadCurveToPoint(CGContextRef cg_nullable c, CGFloat cpx, CGFloat cpy, CGFloat x, CGFloat y)
- // cpx:控制点的x
- // cpy:控制点的y
- // x, y 为线结束的点的坐标
- CGContextAddQuadCurveToPoint(ctx, , , , );
- // 渲染上下文
- CGContextStrokePath(ctx);
方式2(贝瑟尔路径)
- // 圆弧
- // + (instancetype)bezierPathWithArcCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle clockwise:(BOOL)clockwise;
- // Center:圆心
- // radius:半径
- // startAngle:开始角度
- // endAngle:结束角度
- // clockwise:YES:顺时针 NO:逆时针
- CGPoint center = CGPointMake(, );
- UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius: startAngle: endAngle:M_PI_2 clockwise:YES];
- [path stroke];
4、扇形
未填充
- // 扇形
- CGPoint center = CGPointMake(, );
- UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius: startAngle: endAngle:M_PI_2 clockwise:YES];
- // 添加一根线到圆心
- [path addLineToPoint:center];
- // 封闭路径,关闭路径:从路径的终点到起点
- [path closePath];
- [path stroke];
代码效果图:
填充
- // 扇形
- CGPoint center = CGPointMake(, );
- UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius: startAngle: endAngle:M_PI_2 clockwise:YES];
- // 添加一根线到圆心
- [path addLineToPoint:center];
- // 填充:必须是一个完整的封闭路径,默认就会自动关闭路径
- [path fill];
代码效果图:
5、圆角矩形
- // 圆角矩形
- // + (instancetype)bezierPathWithRoundedRect:(CGRect)rect cornerRadius:(CGFloat)cornerRadius;
- // cornerRadius:圆角的弧度,当值为边长的一半时,画出来的图像为圆形
- UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(, , , ) cornerRadius:];
- [path stroke];
- // 填充:必须是一个完整的封闭路径,默认就会自动关闭路径
- // [path fill];
代码效果图:
相关操作同贝塞尔路径的相关操作类似,大家可以试试,对以上内容有什么建议的可以直接联系我,O(∩_∩)O谢谢!
【原】iOS学习之Quartz2D(1)的更多相关文章
- iOS学习笔记--Quartz2D
Quartz 2D是一个二维绘图引擎,同时支持iOS和Mac系统. Quartz 2D能完成的工作: 1. 绘制图形 : 线条\三角形\矩形\圆\弧等 2. 绘制文字 3. 绘制\生成图片(图像) 4 ...
- 原 iOS深入学习(Block全面分析)http://my.oschina.net/leejan97/blog/268536
原 iOS深入学习(Block全面分析) 发表于1年前(2014-05-24 16:45) 阅读(26949) | 评论(14) 39人收藏此文章, 我要收藏 赞21 12月12日北京OSC源创会 ...
- iOS学习——Quartz2D学习之UIKit绘制
iOS学习——Quartz2D学习之UIKit绘制 1.总述 在IOS中绘图技术主要包括:UIKit.Quartz 2D.Core Animation和OpenGL ES.其中Core Animati ...
- 【原】iOS学习之事件处理的原理
在iOS学习23之事件处理中,小编详细的介绍了事件处理,在这里小编叙述一下它的相关原理 1.UITouch对象 在触摸事件的处理方法中都会有一个存放着UITouch对象的集合,这个参数有什么用呢? ( ...
- 【原】iOS学习47之第三方-FMDB
将 CocoaPods 安装后,按照 CocoaPods 的使用说明就可以将 FMDB 第三方集成到工程中,具体请看博客iOS学习46之第三方CocoaPods的安装和使用(通用方法) 1. FMDB ...
- 【原】iOS学习之第三方-AFNetworking1.3.0
将 CocoaPods 安装后,按照 CocoaPods 的使用说明就可以将 AFNetworking 第三方集成到工程中,具体请看上篇博客iOS学习46之第三方CocoaPods的安装和使用(通用方 ...
- 【原】iOS学习之SQLite和CoreData数据库的比较
1. SQLite数据库 sqlite数据库操作的基本流程是, 创建数据库, 再通过定义一些字段来定义表格结构, 可以利用sql语句向表格中插入记录, 删除记录, 修改记录, 表格之间也可以建立联系. ...
- iOS学习笔记-精华整理
iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...
- iOS学习笔记总结整理
来源:http://mobile.51cto.com/iphone-386851_all.htm 学习IOS开发这对于一个初学者来说,是一件非常挠头的事情.其实学习IOS开发无外乎平时的积累与总结.下 ...
随机推荐
- PHP中被定义为false的
if($res == false){ echo "未定义通过<br>"; } $res = 0; if($res == false){ echo "0数字通过 ...
- 部署React+webpack工程的步骤
# 部署React+webpack工程的步骤ps:以Mac os系统做开发环境.因为npm现在使用灰常的慢,所以我使用淘宝境像cnpm. 1,准备工作: 先确保存已经安装了node.js: 2,文件部 ...
- Linux kernel make 常用选项介绍
Linux kernel 编译方法大全记录 一.这是一个我自己写的自动make脚本: #!/bin/sh export ARCH=arm export CROSS_COMPILE=arm-linux- ...
- nginx配置为windows服务中的坑
网上搜索“nginx 配置为windows服务”,很容易搜索到使用windows server warpper来配置,于是按照网上的方法我从github上的链接下载了1.17版本,前面都很顺利,很容易 ...
- 使用ROW_NUMBER()+临时表+While 实现表遍历
declare @table table(dlid int,RowNum int)insert into @table select dlid,ROW_NUMBER() over(order by d ...
- 【ASP.NET】复制单个文件同时到多个目录
有时候,当我们更新了一个dll文件后,需要将该dll文件复制到到不同的文件夹中,手动操作会很麻烦,因此可以考虑利用程序实现. 利用powershell批量复制 示例代码如下: $source=&quo ...
- 如何将 Windows Server 2012 r2 打造成 Windows 8.1?
Server 系列相对于桌面系统Windows 8.1 .嵌入式系统Embedded 8.1来说,还是有所不同的,有其独特性,所以,标题写着“打造”充其量不过是不断接近的意思.还有很多地方存在进一步深 ...
- 在WebPart中获取Office 365中的未读邮件数
// Create the web request HttpWebRequest request = WebRequest.Create("https://outlook.office365 ...
- box-shadow、drop-shadow 和 text-shadow
1. box-shadow 合阴影, 对象选择器 {box-shadow:[投影方式] X轴偏移量 Y轴偏移量阴影模糊半径 阴影扩展半径 阴影颜色} box-shadow属性的参数设置取值: 阴影类型 ...
- 使用ajaxfileupload.js实现上传文件功能
<div class="pictureList"> <div class="pictureItem" id="uploadItem& ...