iOSQuartz2D-01-核心要点
简介
- 作用
- 绘制
- 绘制图形 : 线条\三角形\矩形\圆\弧等
- 绘制文字
- 绘制\生成图片(图像)
- 读取\生成PDF
- 截图\裁剪图片
- 自定义UI控件(通常为内部结构较复杂的控件)
- UIKit中的绝大部分控件都是由系统绘制的
- 矩阵操作(使绘制到图形啥下文中的所有路径都发生变化)
- 缩放
- 旋转
- 平移
简介
- Quartz2D隶属于Core Graphic框架,是一个二维的绘图引擎,直接操于Layer(图层),通常在-drawRect:方法中获取上下文,将需要绘制的内容绘制到图形上下文中,然后将图层渲染到控件,最后关闭图形上下文。
- - (void)drawRect:(CGRect)rect,该方法只会界面即将显示的时候调用一次,若要在此调用需要调用重绘方法- (void)setNeedsDisplay
常用的绘制操作
- 绘制直线(三种方法)
- 通过添加路径的方式绘制直线,最后把路径渲染的上下文
- 开启上下文
- CGContextRef context = UIGraphicsGetCurrentContext()
- 描述所要绘制的路径
- 创建路径
CGMutablePathRef CGPathCreateMutable(void) - 设置起点
void CGPathMoveToPoint(CGMutablePathRef path, const CGAffineTransform *m, CGFloat x, CGFloat y) - 连线
void CGPathAddLineToPoint(CGMutablePathRef path, const CGAffineTransform *m, CGFloat x, CGFloat y)
- 创建路径
- 将路径添加到上下文
- void CGContextAddPath(CGContextRef context, CGPathRef path)
- 渲染上下文
- void CGContextStrokePath(CGContextRef c)
- 直接在上下文中绘制直线
- 开启上下文
- CGContextRef context = UIGraphicsGetCurrentContext()
- 描述所要绘制的路径
- 设置起点
void CGContextMoveToPoint(CGContextRef c, CGFloat x, CGFloat y) - 连线
void CGContextAddLineToPoint(CGContextRef c, CGFloat x, CGFloat y)
- 设置起点
- 渲染上下文
- void CGContextStrokePath(CGContextRef c)
- 通过贝瑟尔绘制直线
- 常见贝瑟尔路径(最普通的路径)
- (UIBezierPath *)bezierPath
- 设置起点
- (void)moveToPoint:(CGPoint)point
- 连线
- (void)addLineToPoint:(CGPoint)point
- 渲染
- (void)stroke
绘制曲线
- 获取上下文
- CGContextRef UIGraphicsGetCurrentContext(void)
- 绘制路径
- 设置起点
void CGContextMoveToPoint(CGContextRef c, CGFloat x, CGFloat y) - 连线
void CGContextAddQuadCurveToPoint(CGContextRef c, CGFloat cpx, CGFloat cpy, CGFloat x, CGFloat y) - 渲染上下文
void CGContextStrokePath(CGContextRef c)
绘制圆弧(通过贝瑟尔路径)
- 创建贝瑟尔路径
- + (UIBezierPath *)bezierPathWithArcCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle clockwise:(BOOL)clockwise
- - (void)stroke
绘制饼状图
- 思路:
1) 饼状图其实是在圆弧的基础上增加了两条线而完成 - 实现步骤
- 通过贝瑟尔路径绘制圆弧
- + (UIBezierPath *)bezierPathWithArcCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle clockwise:(BOOL)clockwise
- 添加直线使路径封闭
- 从路径终点到圆弧圆心添加直线
- - (void)addLineToPoint:(CGPoint)point
- 路径起点到圆弧圆心的直线会被自动添加
调用- (void)fill方法是自动添加
- 设置填充颜色
- - (void)set,此方法是UIColor对象的方法,用于设置上下文填充或渲染的颜色
- 填充并封闭路径并渲染
- - (void)fill,通过贝瑟尔路径调用该方法
- 思路:
绘制柱状图
- 思路
1) 通过贝瑟尔路径可以直接绘制柱状图 - 实现步骤
- 创建贝瑟尔路径
- + (UIBezierPath *)bezierPathWithRect:(CGRect)rect
- 设置填充颜色
- - (void)set,此方法是UIColor对象的方法,用于设置上下文中填充或渲染的颜色
- 填充并封闭路径并渲染
- - (void)fill
- 思路
绘制文字
- 思路
- NSString的分类NSStringDrawing实现了将NSString对象的绘制方法
- - (void)drawAtPoint:(CGPoint)point withAttributes:(NSDictionary *)attrs,从某个点开始绘制文字
- - (void)drawInRect:(CGRect)rect withAttributes:(NSDictionary *)attrs,在rect区域内绘制文字
- 在绘制文字是,还可以通过attrs参数设置其属性
- 实现步骤
- 创建NSString对象
- 设置文本属性(其属性不存在一个字典中,通过指定的key去设置相应的属性)
- 设置文本颜色
NSForegroundColorAttributeName - 设置字体
NSFontAttributeName - 设置渲染时的宽度
NSStrokeWidthAttributeName - 设置渲染时的颜色
NSStrokeColorAttributeName - 设置背景属性
NSShadowAttributeName
设置背景颜色:shadowColor(UIColor)
模糊属性:shadowBlurRadius(CGFloat)
偏移量:shadowOffset
- 设置文本颜色
- 绘制文字
- - (void)drawInRect:(CGRect)rect withAttributes:(NSDictionary *)attrs
- - (void)drawAtPoint:(CGPoint)point withAttributes:(NSDictionary *)attrs,若使用该方法,则文字会单行显示
- 绘制图片
- 思路
直接调用UIImage的用于绘制的对象方法即可绘制 - 实现步骤
- 创建UIImage对象
- 创建绘制区域
- 设置超出绘制区域的内容被剪掉
UIRectClip(CGRect rect) - 绘制图片
- - (void)drawAsPatternInRect:(CGRect)rect,平铺的方式显示图片,铺满整个绘制区域(rect)
- - (void)drawAtPoint:(CGPoint)point,显示一张与原来图片大小一样的图片
- - (void)drawInRect:(CGRect)rect,图片被拉伸,大小等于rect
- - (void)drawAtPoint:(CGPoint)point blendMode:(CGBlendMode)blendMode alpha:(CGFloat)alpha
- 思路
iOSQuartz2D-01-核心要点的更多相关文章
- dubbo核心要点及下载(dubbo二)
一.dubbo核心要点 1):服务是围绕服务提供方和服务消费方的,服务提供方实现服务,服务消费方调用服务. 2):服务注册 对于服务提供方它需要发布服务,而由于应用系统的复杂性,服务的数量.类型不断的 ...
- [转载] JAVA面试题和项目面试核心要点精华总结(想进大公司必看)
JAVA面试题和项目面试核心要点精华总结(想进大公司必看) JAVA面试题和项目面试核心要点精华总结(想进大公司必看)
- Page Object页面设计模式核心要点
Page Object,页面对象.一种设计模式,实施selenium的最佳实践,体现了web应用与页面显示之间的关系.为什么需要Page Object?测试代码维护的需要:减少代码的编码量,减少代 ...
- Java生鲜电商平台-SpringCloud微服务架构中核心要点和实现原理
Java生鲜电商平台-SpringCloud微服务架构中核心要点和实现原理 说明:Java生鲜电商平台中,我们将进一步理解微服务架构的核心要点和实现原理,为读者的实践提供微服务的设计模式,以期让微服务 ...
- Spark之RDD容错原理及四大核心要点
一.Spark RDD容错原理 RDD不同的依赖关系导致Spark对不同的依赖关系有不同的处理方式. 对于宽依赖而言,由于宽依赖实质是指父RDD的一个分区会对应一个子RDD的多个分区,在此情况下出现部 ...
- java高并发核心要点|系列文章
java高并发核心要点|系列1|开篇 java高并发核心要点|系列2|锁的底层实现原理 java高并发核心要点|系列3|锁的底层实现原理|ABA问题 java高并发核心要点|系列4|CPU内存指令重排 ...
- Android应用框架中的四个核心要点
Android应用框架中的四个核心要点:活动(Activity).消息(Intent).视图(View).任务(Task) (一)活动Activity Android系统内部有专门的Activity堆 ...
- 高效CSS开发核心要点摘录
做网站的,我们都知道尽量减少请求数,压缩CSS代码量,使用高效CSS选择符等方式可以来提高网站的载入速度和访问速度,也就是优化网站的性能. 下面分析了一些CSS的书写方式,很多都是我们知道并且正在使用 ...
- CoreAnimation-01-CALayer核心要点及实例解析
CALayer基础 CALayer是每一个UI控件的核心,一个UI控件之所以能显示可以说是CALayer的功劳 每一个UI控件默认都为自己创建一个CALayer对象,通过drawRect方法将内容绘制 ...
- OC - 21.CALayer核心要点及实例解析
CALayer基础 CALayer是每一个UI控件的核心,一个UI控件之所以能显示可以说是CALayer的功劳 每一个UI控件默认都为自己创建一个CALayer对象,通过drawRect方法将内容绘制 ...
随机推荐
- 这些年你需要注意的SQL
[20141114]这些年你需要注意的SQL *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bot ...
- Git 分支合并
理解核心 Git最初只有一个分支,所有后续分支都是直接或间接的从这个分支切出来的. 在任意两个分支上,向前追溯提交记录,都能找到一个最近的提交同时属于这两个分支,这个提交就是两个分支的分叉节点 分支合 ...
- 如何在java中使用sikuli进行自动化测试
很早之前写过一篇介绍sikuli的文章.本文简单介绍如何在java中使用sikuli进自动化测试. 图形脚本语言sikuli sikuli IDE可以完成常见的单击.右击.移动到.拖动等鼠标操作,ja ...
- [linux笔记]理清linux安装程序用到的(configure, make, make install)
我作为一名经常和linux打交道的程序员,每次在linux安装软件都祈求可以用——apt-get,yum,brew等应用程序管理器安装,有的时候事与愿违,你只能自己编译安装-wtf,说好的美丽世界呢? ...
- SQL Server 2014里的IO资源调控器
在本文中,我们将来看看SQL Server 2014在资源调控器方面增加了哪些新的功能.资源调控器(Resource Governor)是从SQL Server 2008开始出现的一项功能.它是用于管 ...
- SQL语句技巧:查询时巧用OR实现逻辑判断
首先看以下SQL逻辑语句块: ) ) SET @fieldname='chassisno' --这里可传入chassisno,plateno,owner,contacttelno其中之一或不传 SET ...
- JS魔法堂:那些困扰你的DOM集合类型
一.前言 大家先看看下面的js,猜猜结果会怎样吧! 可选答案: ①. 获取id属性值为id的节点元素 ②. 抛namedItem is undefined的异常 var nodes = documen ...
- Gradle学习系列之一——Gradle快速入门
这是一个关于Gradle的学习系列,其中包含以下文章: Gradle快速入门 创建Task的多种方法 读懂Gradle语法 增量式构建 自定义Property 使用java Plugin 依赖管理 构 ...
- javaScript一些函数包括调试方法(二)
Number():设法把括号里面的值,转换成一个数,转换不了为数字的话,就返回NaN. 注意:Number()函数,会拒绝任何包含,非数字字符的字符串(阿拉伯数字.一个有效的小数位.+.-符号是允许的 ...
- Dancing Link --- 模板题 HUST 1017 - Exact cover
1017 - Exact cover Problem's Link: http://acm.hust.edu.cn/problem/show/1017 Mean: 给定一个由0-1组成的矩阵,是否 ...