(四十七)Quartz2D引擎初步
Quartz2D是跨平台的,同时支持iOS与Mac。
支持圆型裁剪,可以实现圆形头像等功能,也支持手势解锁、折线图等的制作。
对于复杂的UI界面,还可以通过Quartz2D将控件内部的结构画出来,可用于自定义控件。
实际上iOS大部分控件都是通过Quartz2D画出来的,一个重要价值是自定义view。
一些基础概念:
1.图形上下文(Graphics Context):是CGContextRef类型数据
能保存绘图信息、绘图状态,决定绘制的输出目标,可以输出到文件或者窗口。
绘制好的图像先保存到图形上下文,再显示到输出目标。
Tip:相同的图像,经过不同的图形上下文,就可以显示到不同的地方。
Quartz2D支持的类型:Bitmap、PDF、Window、Layer、Printer.
2.自定义view
拥有图形上下文,并且与view有关。
步骤:
1.新建一个类,继承自UIView。
2.实现drawRect: rect方法画图。
3.须知:
1.后面绘制的部分覆盖前面绘制的部分。
2.Quartz2D的API是纯C代码。
3.Quartz2D来自CoreGraphics框架。
4.数据类型和函数基本都是以CG开头。
重写UIView的drawRect方法,可以绘制图形,绘制直线的方法:
1.绘制直线
以CGContext开头的,MoveToPoint、AddLineToPoint以及StrokePath方法
Tip:如果要画独立的直线,只要多次使用MoveToPoint即可。
Tip:drawRect函数在View第一次显示到屏幕上的时候会调用一次,重绘时也会调用一次。
- (void)drawRect:(CGRect)rect {// 1.获得图形上下文CGContextRef ctx = UIGraphicsGetCurrentContext();// 2.拼接图形(路径)// 2.1设定起点CGContextMoveToPoint(ctx, 10, 10);// 2.2添加一条线从起点到(100,100)CGContextAddLineToPoint(ctx, 100, 100);// 2.3从上次终点继续绘制CGContextAddLineToPoint(ctx, 150, 40);// 2.4回到起点,关闭路径CGContextAddLineToPoint(ctx, 10, 10);// 3.渲染显示到view上,stroke是空心的形式。CGContextStrokePath(ctx);}
2.绘制矩形:
CGContextAddRect(ctx, CGRectMake(10, 10, 100, 100));
Tip:Stroke方法画的是空心图形,将Stroke换为Fill可得到填充图形。
3.设置状态的代码(颜色、粗细):
Tip:设置状态的代码一定要放在渲染的前面,放在绘制函数的前后都可以。
3.1设置线宽:
CGContextSetLineWidth(ctx, 10);
3.2设置颜色:有Stroke和Fill两种方式,注意小数是 x / 255.0。
CGContextSetRGBStrokeColor(ctx, 255/255.0, 125/255.0, 0.0, 1.0)
Tip:状态只在渲染的时候确定,因此多个状态不同的内容应该渲染多次。
3.3线段头尾样式(圆形):三中,Miter是默认的发射状(方形)、Round为圆形、Bevel为裁剪。
CGContextSetLineCap(ctx, kCGLineCapRound);
连接点样式:
CGContextSetLineJoin(ctx, kCGLineJoinRound);
Tip:如果使用多次渲染,那么之前绘制的路径尾就无法继续使用了,应该重新确立起点。
Tip:CMYK是印刷色彩颜色,由青、品红、黄、黑构成,RGB由红绿蓝构成。
设置颜色的一个简便方法:
使用UIColor对象的setStroke与setFill方法:如果写set则是全部设置。
[[UIColor redColor] setStroke];
4.绘制圆和椭圆:通过外接矩形确定。
// 圆形CGContextAddEllipseInRect(ctx, CGRectMake(10, 10, 60, 60));// 椭圆CGContextAddEllipseInRect(ctx, CGRectMake(100, 100, 100, 50));
5.绘制圆弧:
/*** 绘制圆弧** @param c#> 图形上下文 description#>* @param x#> 圆心x description#>* @param y#> 圆心y description#>* @param radius#> 半径 description#>* @param startAngle#> 起始角度 description#>* @param endAngle#> 结束角度 description#>* @param clockwise#> 圆弧生长方向 0顺 1逆 description#>**/CGContextAddArc(<#CGContextRef c#>, <#CGFloat x#>, <#CGFloat y#>, <#CGFloat radius#>, <#CGFloat startAngle#>, <#CGFloat endAngle#>, <#int clockwise#>);
需要注意的是角度为弧度,应该通过系统的宏来换算:M_PI_2表示二分之PI,M_1_PI表示0.1PI。
另外注意一点这里的角度和数学定义不同,顺时针为正角度,逆时针为负角度。
6.图片和文字结合:
Tip:Quartz2D的坐标系和数学上一致,但是UIKit框架做了转换,和屏幕坐标系一致都是左上角为(0,0),因此使用纯C语言绘制出来的东西是倒着的。
利用OC来绘制字符串不需要调用和上下文:
NSString *str = @"一段文字";
[str drawAtPoint:CGPointMake(0, 0) withAttributes:nil];
想把文字放到矩形框内,使用drawInRect,还可以自动换行。
withAttributes是对状态的设置,注意要传入字典。
参数已经定义成字符串常量:
NSMutableDictionary *attrs = [NSMutableDictionary dictionary];
attrs[NSForegroundColorAttributeName] = [UIColor whiteColor];
[str drawAtPoint:CGPointMake(0, 0) withAttributes:attrs];
常见的属性:
NSForegroundColorAttributeName为文字颜色。
NSFontAttributeName为字体。
图片的绘制:
直接绘制:
[UIImage imageNamed:@"me"];
[image drawInRect:CGRectMake(0, 0, 150, 150)];
平铺:
[UIImage imageNamed:@"me"];
[image drawAsPatternInRect:CGRectMake(0, 0, 150, 150)];
转载于:https://www.cnblogs.com/aiwz/p/6154204.html
(四十七)Quartz2D引擎初步相关推荐
- NeHe OpenGL教程 第四十七课:CG顶点脚本
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- Python编程基础:第四十七节 抽象类Abstract Classes
第四十七节 抽象类Abstract Classes 前言 实践 前言 抽象类可以这么理解,它就是一个模板,里面声明了子类必须定义的函数,但是对于每个函数都没有给出具体实现.所有函数的实现都是在子类中定 ...
- OpenCV学习笔记(四十六)——FAST特征点检测features2D OpenCV学习笔记(四十七)——VideoWriter生成视频流highgui OpenCV学习笔记(四十八)——PCA算
OpenCV学习笔记(四十六)--FAST特征点检测features2D 特征点检测和匹配是计算机视觉中一个很有用的技术.在物体检测,视觉跟踪,三维常年关键等领域都有很广泛的应用.这一次先介绍特征点检 ...
- ABP源码分析四十七:ABP中的异常处理
ABP源码分析四十七:ABP中的异常处理 参考文章: (1)ABP源码分析四十七:ABP中的异常处理 (2)https://www.cnblogs.com/1zhk/p/5538983.html (3 ...
- 【零基础学Java】—finally代码块(四十七)
[零基础学Java]-finally代码块(四十七)
- JavaScript学习(四十七)—构造方法创建对象的不足
JavaScript学习(四十七)-构造方法创建对象的不足 构造方法创建对象的不足 如果将所有的属性和方法都封装到构造方法中,那么在创建对象时,每个对象身上都会有独立的一份构造方法中的属性和方法. 如 ...
- 问题四十七:怎么用ray tracing画superellipsoid (2)
网络上有另外一种更为简单的superellipsoid的方程形式:(这种方程,更快些) 数学推导和"问题四十六"类似(应该是更为简单),此处不表. 47.1 看C++代码实现 -- ...
- 【Visual C++】游戏开发笔记四十七 浅墨DirectX教程十五 翱翔于三维世界 摄像机的实现
分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow 本系列文章由zhm ...
- 四十七、Fluent近壁面处理
0. 前言 今天这篇文章,我们介绍一下近壁面处理的方式来求解湍流壁面物理规律. 前文四十五.四十六及本文四十七这三篇文章可以说是非常详细而系统的把壁面函数及相关理论全都介绍了一遍,大家可以参考进行设置 ...
最新文章
- 第十五届全国大学生智能车安徽赛区参赛须知和竞赛日程安排
- 实战 | F1060路由模式ISIS典型组网配置案例
- [转] Java内部类详解
- CentOS6 x86_64最小化安装优化脚本
- call、apply和bind的用法与说明
- python自带数据库是什么意思_原来Python自带了数据库,用起来真方便!
- mysql 数据联合查询语句_MySQL - 数据查询 - 联合查询
- IDEA 个人私藏插件
- 用 Python 实现电影订票系统 | 内附源码
- Python免费发短信
- 优化算法之指数加权平均详解
- 轻松一下:世界上最全的解酒方法
- 论文阅读: Channel Augmented Joint Learning for Visible-Infrared Recognition
- 老程序员都去哪儿了?国内的大龄程序员都去哪了
- Java基础(十二)
- 《Python源码剖析》读书笔记
- VB6.0安装鼠标滚轮
- 【C++】Floyd算法
- u盘损坏了还能恢复吗?u盘已损坏的三种修复方法
- 如何使用GitHub Desktop管理Gitlab库
热门文章
- java的scanner用法_Java Scanner用法详解
- php包含文件时显示空白页,php中添加了如下语句出现空白页 删除页面zhengchang
- 存clob为空的值_将网页文本(HTML)保存到ORACLE数据库CLOB字详解
- php smarty模板引擎 性能,smarty性能低?直接使用php模板引擎吧
- 河南大学明德计划2020计算机学院,河南大学启动“明德计划”
- Leetcode 552.学生出勤记录‖ 动态规划+容斥
- OpenCV 错误:无法打开摄像头(打开摄像头卡机)
- 树莓派视觉小车 -- 小球追踪(颜色追踪)(OpenCV色彩空间HSV)
- 大规模环境下基于语义直方图的多机器人实时全局定位图匹配
- 剑指offer:面试题14- I. 剪绳子