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方法将内容绘制 ...
随机推荐
- int.class 与 Integer.class
TYPE 表示的引用类型所对应的基本类型的Class对象!
- 标志数在wordcount程序中的应用与拓展
wordcount程序要求测出文本中的单词数,字符数和行数. 设计思路: 将文件读入,逐字检测,检测到空格单词数加一,检测到回车行数单词数加一,如果既不是回车也不是空格则说明是字符,字符数加一 编程时 ...
- Node.js 入门手册:那些最流行的 Web 开发框架
这篇文章与大家分享最流行的 Node.js Web 开发框架.Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用程序,编 ...
- Socket.IO – 基于 WebSocket 构建跨浏览器的实时应用
Socket.IO 是一个功能非常强大的框架,能够帮助你构建基于 WebSocket 的跨浏览器的实时应用.支持主流浏览器,多种平台,多种传输模式,还可以集合 Exppress 框架构建各种功能复杂 ...
- python网络编程socket /socketserver
提起网络编程,不同于web编程,它主要是C/S架构,也就是服务器.客户端结构的.对于初学者而言,最需要理解的不是网络的概念,而是python对于网络编程都提供了些什么模块和功能.不同于计算机发展的初级 ...
- UWP开发入门(十九)——10分钟学会在VS2015中使用Git
写程序必然需要版本控制,哪怕是个人项目也是必须的.我们在开发UWP APP的时候,VS2015默认提供了对微软TFS和Git的支持.考虑到现在Git很火,作为微软系的程序员也不得不学一点防身,以免被开 ...
- EF封装类 增加版,增加从缓存中查找数据方法,供参考!
EF封装类 增加版,增加从缓存中查找数据方法,供参考! 这个类是抽象类,我这里增加了需要子类验证的方法ValidateEntity,方便扩展,若想直接使用该类,可以将该类更改成静态类,里面所有的方法都 ...
- [Test] 单元测试艺术(1) 基础知识
单元测试不是软件开发的新概念,在1970年就一直存在,屡屡被证明是最理想的方法之一. 本系列将分成3节: 单元测试基础知识 打破依赖,使用模拟对象,桩对象,测试框架 创建优秀的单元测试 本节索引: 单 ...
- dp --- 2014 Asia AnShan Regional Contest --- HDU 5074 Hatsune Miku
Hatsune Miku Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5074 Mean: 有m种音符(note),现在要从 ...
- 怎样实现Web控件文本框Reset的功能
在ASP.NET开发过程序,在数据插入之后,文本框TextBox控件需要Reset.如果只有一两个文件框也许没有什么问题,如果网页上有很多文本框,你就会有点问题了.再加上某一情形,一些文本框是有默认值 ...