首页 > (四十七)Quartz2D引擎初步

(四十七)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

更多相关:

  • 我们经常想要绘制各种形状,为此,OpenCV提供了一系列功能,可以绘制直线,矩形,圆等。OpenCV的绘图功能适用于图像,但其中大多数仅影响前三个通道,在单通道图像的情况下仅默认第一个通道。大多数绘图支持颜色,厚度,线条类型的修改。当指定颜色时,使用Scalar对象,大部分只使用前三个值。有时可以使用Scalar中的第四个值来表示al...

  • 学习如何在AutoCad中绘制建筑设计图从平面图到AutoCad土木工程中的整栋建筑 你会学到: 如何绘制房屋地图 如何绘制建筑设计 如何从AutoCad打印或出图 AutoCaD使用 AutoCaD命令使用 如何在2D Autocad中构建家庭或房屋地图(完整教程视频包括家庭地图、窗户、门、室内家具或物品、绘画等。) 能够担...

  • MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz,2 Ch 技能水平:初级|语言:英语+中英文字幕(根据原英文字幕机译更准确) |持续时间:3h 1m |大小解压后:1.7 GB 含课程练习文件 C4D继续作为3D艺术家的行业标准解决方案大放异彩,它提供了一套独特的工具,专门用于创建引人注目的运动图形...

  • 由于绘制矢量图的不同技术愈发成熟以及现代浏览器所具备的更强大的计算能力等原因,目前网上出现了越来越多免费 的JavaScript图表和图形绘制解决方案。在本文中就将分享13个优秀实用的JavaScript图表和图形绘制插件,它们少数是独立的框架,大多 数支持条图、线图、饼图等基本图形,很多甚至支持更加复杂的图形,希望对你有所帮助。...