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方法将内容绘制 ...
随机推荐
- 8月11日嵌入式Linux开发免费项目体验邀您参与
嵌入式Linux开发免费项目体验开课啦~~我们特意邀请到粤嵌金牌讲师和技术专家,为大家带来精彩有趣的嵌入式公开课,涉及到嵌入式学习.研发的方方面面.课堂中我们能体验到的不仅仅是最新资讯.技术体验,还有 ...
- 开发者讨厌你API的十个原因
PS:原文是PDF(E文),原书名称:10ReasonsWhyDevelopersHateYourAPI 1.文档的吸引力太弱 解决之道 采用大图片:示例站点 文档清晰度:示例站点 文档易于查找:示例 ...
- bootstrap插件学习-bootstrap.typehead.js
先看bootstrap.typehead.js的结构 var Typeahead = function ( element, options ){} //构造器 Typeahead.prototype ...
- gcview使用
1.下载适用的版本 https://github.com/chewiebug/GCViewer Supported verbose:gc formats are: Oracle JDK 1.8 -Xl ...
- 【转载】Linux下编辑生成.mo文件
转载自:http://www.hackbase.com/tech/2012-02-27/65972.html 编辑生成.mo文件 我们在弄网站的时候很可能会接触到.mo和.po文件..po文件是GNU ...
- js关于对象键值为数字型时输出的对象自动排序问题的解决方法
一.对象键值为数字型时输出的对象自动排序问题如: var objs = { "1603":{id:"1603"}, "1702" ...
- [ShortCut] IE10快捷键
适用范围: Windows 8 操作步骤: 1.快速输入网址: “Ctrl+L”.“F4”:在IE10下按下“Ctrl+L”快捷键,可以直接将光标转到浏览器地址栏(注:地址栏中的网址会被选中),可以直 ...
- Web前端面试题集锦
前端开发面试知识点大纲: 注意 转载须保留原文链接(http://www.cnblogs.com/wzhiq896/p/5927180.html )作者:wangwen896 HTML&CSS ...
- 6/14 sprint2 看板和燃尽图的更新
看板: 燃尽图: 例会照: 总结:因为最近刚好碰上端午假期,再加上程序出了点问题,所以导致进度有点慢, 但是我们还是很努力地在找资料把问题给解决了,虽然完成的情况有点不如人意, 但是我们付出的努力还是 ...
- WPF 中获取DataGrid 模板列中控件的对像
WPF 中获取DataGrid 模板列中控件的对像 #region 当前选定行的TextBox获得焦点 /// <summary> /// 当前选定行的TextBox获得焦点 /// &l ...