Quzrtz 2D 绘图的核心 API 是 CGContextRef ,它专门用于绘制各种图形。

绘制图形关键是两步:

1、获取 CGContextRef ;

2、调用 CGContextRef 的方法进行绘制。

在不同的场景下获取 ContextRef 的方法是不同的:

1、在 自定义 UIVie  的时候获取 CGContextRef ,我们会创建一个继承自 UIVIew 的子类,在该 子类的 view 中重写 DrawReact 方法,每当打开该 View的时候,系统就会创建绘图的环境,然后进行绘制图片。

CGContextRef ctf = UIGraphicsGetCurrentContext();

获取到 ctf 之后就可以进行绘图 。注意绘图的时候默认的是在 view 的最左上角开始为原点。

2、在创建位图的时候获取 CGContextRef,首先要在内存中创建图片

// 创建内存中的图片

UIGraphicsBeginImageContext(CGSizeMake(300, 150));

// 获取向内存中图片绘图的 CGcontextRef

CGContextRef ref = UIGraphicsGetCurrentContext();

Quartz  2D 绘图函数:

#pragma mark  下面是 Quartz 2D 的绘图函数

    // 擦除指定矩形区域上绘制的图形
// CGContextClearRect(<#CGContextRef _Nullable c#>, <#CGRect rect#>) // 使用指定的绘图模式绘制当前 CGContextRef 中包含的路径,第二个参数包含 kCGPathFill、 kCGPathFill,kCGPathEOFill,kCGPathStroke,kCGPathFillStroke,kCGPathEOFillStroke等枚举值
// CGContextDrawPath(<#CGContextRef _Nullable c#>, <#CGPathDrawingMode mode#>) // 使用奇偶规则来来填充该路径包围的区域。奇偶规则:如果某个点被路径包围奇数次,则系统绘制该点,如果某个点被路径包围了偶数次,则该系统不绘制该点。
// CGContextEOFillPath(<#CGContextRef _Nullable c#>) // 填充该路径包围的区域
// CGContextFillPath(<#CGContextRef _Nullable c#>) // 填充 rect 代表的矩形
// CGContextFillRect(<#CGContextRef _Nullable c#>, <#CGRect rect#>) // 填充多个矩形
// CGContextFillRects(<#CGContextRef _Nullable c#>, <#const CGRect * _Nullable rects#>, <#size_t count#>) // 填充 Rect 的内切椭圆区域
// CGContextFillEllipseInRect(<#CGContextRef _Nullable c#>, <#CGRect rect#>) // 使用当前的 CGContextRef 设置的线宽去绘制路径
// CGContextStrokePath(<#CGContextRef _Nullable c#>) // 使用当前的 CGContextRef 设置的线宽去绘制矩形
// CGContextStrokeRect(<#CGContextRef _Nullable c#>, <#CGRect rect#>) // 使用指定的线宽去绘制矩形
// CGContextStrokeRectWithWidth(<#CGContextRef _Nullable c#>, <#CGRect rect#>, <#CGFloat width#>) // 使用绘制当前路径时覆盖的区域作为当前 CGContextRef 中的新路径。如:假设当前 CGContextRef 包含一个圆形的路径切线宽为 10,调用该方法后,当前的 CGContextRef 将包含一个环宽为 10 的环形路径。
// CGContextReplacePathWithStrokedPath(<#CGContextRef _Nullable c#>) // 使用当前 CGContextRef 设置的线宽绘制 rect 矩形的内切椭圆
// CGContextStrokeEllipseInRect(<#CGContextRef _Nullable c#>, <#CGRect rect#>) // 使用但钱 CGCOntextRef 设置的线宽绘制 多条线段。噶方法需要传入 2N 个 CGPoint 组成的数组,期中 1,2个点组成一条线段,3,4个点组成第2条线段,以此类推。
// const CGPoint points[],size_t count // 保存 CGContextRef 当前绘制的图形状态,方便以后恢复该状态
// CGContextSaveGState(<#CGContextRef _Nullable c#>) // 将 CGContextRef 恢复到最近一次保存的状态
// CGContextRestoreGState(<#CGContextRef _Nullable c#>) // 获取当前 CGCOntextRef 在放大图片的插值质量
// CGContextGetInterpolationQuality(<#CGContextRef _Nullable c#>) // 设置当前 CGCOntextRef 在放大图片的插值质量
// CGContextSetInterpolationQuality(<#CGContextRef _Nullable c#>, <#CGInterpolationQuality quality#>) // 设置线段断点的绘制形状,该属性支持如下三个枚举值:
/* kCGLineCapButt: 该属性值不会绘制端点,线条结尾的地方直接结束,这是默认值
kCGLineCapRound: 该属性会绘制圆形的端点,线条结尾的地方会绘制一个直径为线条半径的半圆
kCGLineCapSquare:该属性值制定绘制方形的端点,线条的结尾处会绘制半个边长为宽度的正方形,这种端点的形状与butt 的端点形状十分相似,只是结尾的线条略微的长些。
*/ // 设置边框的时候所用的点线模式,Quzrta 2D 支持非常强大的点线模式。
// CGContextSetLineDash(<#CGContextRef _Nullable c#>, <#CGFloat phase#>, <#const CGFloat * _Nullable lengths#>, <#size_t count#>) // 设置线条链接点的风格,该属性支持如下三个枚举值:
/* kCGLineJoinMiter;是默认的属性值;链接点的拐角比较尖锐
kCGLineJoinBevel;链接点的拐角比较圆润
kCGLineJoinRound;连接点的拐角相当的圆润,最圆润。
*/ // 设置绘制直线、边框的线条宽度
// CGContextSetLineWidth(<#CGContextRef _Nullable c#>, <#CGFloat width#>) // 当吧链接点风格设置为 meter 风格的时候,该方法用于控制锐角箭头的长度。
// CGContextSetMiterLimit(<#CGContextRef _Nullable c#>, <#CGFloat limit#>) // 设置该 CGContextRes 采用位图填充的相位
// CGContextSetPatternPhase(<#CGContextRef _Nullable c#>, <#CGSize phase#>) // 设置该 CGContextRef 使用位图填充
// CGContextSetFillPattern(<#CGContextRef _Nullable c#>, <#CGPatternRef _Nullable pattern#>, <#const CGFloat * _Nullable components#>) //设置该 CGContextRef 是否应该抗锯齿,即光滑图形曲线边缘
// CGContextSetShouldAntialias(<#CGContextRef _Nullable c#>, <#bool shouldAntialias#>) // 设置该 CGContextRef 使用位图绘制线条,边框
// CGContextSetStrokePattern(<#CGContextRef _Nullable c#>, <#CGPatternRef _Nullable pattern#>, <#const CGFloat * _Nullable components#>) // 设置 CGContextRef 的叠加模式,Quartz 2D 支持多种叠加模式。
// CGContextSetBlendMode(<#CGContextRef _Nullable c#>, <#CGBlendMode mode#>) // 设置该 CGCOntextRef 是否允许抗锯齿
// CGContextSetAllowsAntialiasing(<#CGContextRef _Nullable c#>, <#bool allowsAntialiasing#>) // 设置该 CGContextRef 是否允许光滑的字体
// CGContextSetAllowsFontSmoothing(<#CGContextRef _Nullable c#>, <#bool allowsFontSmoothing#>) // 设置该 CGContextRef 是否允许光滑字体
// CGContextSetShouldSmoothFonts(<#CGContextRef _Nullable c#>, <#bool shouldSmoothFonts#>) // 设置全局的透明度
// CGContextSetAlpha(<#CGContextRef _Nullable c#>, <#CGFloat alpha#>) // 使用 CMYK 颜色模式来设置 CGContextRef 的填充模式
// CGContextSetCMYKFillColor(<#CGContextRef _Nullable c#>, <#CGFloat cyan#>, <#CGFloat magenta#>, <#CGFloat yellow#>, <#CGFloat black#>, <#CGFloat alpha#>) // 使用 CMYK 颜色模式设置 CGCOntextRef 的线条颜色
// CGContextSetCMYKStrokeColor(<#CGContextRef _Nullable c#>, <#CGFloat cyan#>, <#CGFloat magenta#>, <#CGFloat yellow#>, <#CGFloat black#>, <#CGFloat alpha#>) // 使用指定的颜色来设置 CGCntextRef 的填充颜色
// CGContextSetFillColorWithColor(<#CGContextRef _Nullable c#>, <#CGColorRef _Nullable color#>) // 使用指定颜色来设置 CGContextRef 的线条颜色
// CGContextSetStrokeColorWithColor(<#CGContextRef _Nullable c#>, <#CGColorRef _Nullable color#>) // 使用灰色来设置该 CGCOntextRef 的填充色
// CGContextSetGrayFillColor(<#CGContextRef _Nullable c#>, <#CGFloat gray#>, <#CGFloat alpha#>) // 使用灰色来设置该 CGContextRef 的线条的颜色
// CGContextSetGrayStrokeColor(<#CGContextRef _Nullable c#>, <#CGFloat gray#>, <#CGFloat alpha#>) // 使用 RGB 颜色模式来设置该 CGContextRef 的填充颜色
// CGContextSetRGBFillColor(<#CGContextRef _Nullable c#>, <#CGFloat red#>, <#CGFloat green#>, <#CGFloat blue#>, <#CGFloat alpha#>) // 使用 RGB 颜色模式来设置该 CGContextRef 的线条颜色
// CGContextSetRGBStokeColor(<#CGContextRef _Nullable c#>, <#CGFloat red#>, <#CGFloat green#>, <#CGFloat blue#>, <#CGFloat alpha#>) // 设置阴影在 X|Y方向上的偏移量,以及模糊程度(blur 值越大,阴影越模糊)该函数没有设置阴影颜色,默认使用 1/3 透明的黑色 (RGBA(0,0,0,1/3))
// CGContextSetShadow(CGContextRef _Nullable c, <#CGFloat red#>, <#CGFloat green#>, <#CGFloat blue#>, <#CGFloat alpha#>) // 设置阴影在 X、Y方向上的偏移,以及模糊度和阴影的颜色
// CGContextSetShadowWithColor(<#CGContextRef _Nullable c#>, <#CGSize offset#>, <#CGFloat blur#>, <#CGColorRef _Nullable color#>)

编写绘图的代码:

#import "GeometryView.h"

@implementation GeometryView

// 在使用到 XIB 或者是 SB 的时候,使用 initWithFrame 就不能执行内部的设置,但是initWithCoder 就可以执行内部的设置
- (instancetype)initWithCoder:(NSCoder *)coder
{
self = [super initWithCoder:coder];
if (self) { self.backgroundColor = [UIColor whiteColor];
}
return self;
} // 开始重新绘制图形与图案
- (void)drawRect:(CGRect)rect { // 获取上下文
CGContextRef ctx = UIGraphicsGetCurrentContext(); // 设置线的宽
CGContextSetLineWidth(ctx, );
CGContextSetRGBStrokeColor(ctx, , , , ); #pragma mark 下面绘制3个线段测试端点的形状 /*
设置线段断点的绘制形状,该属性支持如下三个枚举值:
kCGLineCapButt: 该属性值不会绘制端点,线条结尾的地方直接结束,这是默认值
kCGLineCapRound: 该属性会绘制圆形的端点,线条结尾的地方会绘制一个直径为线条半径的半圆
kCGLineCapSquare:该属性值制定绘制方形的端点,线条的结尾处会绘制半个边长为宽度的正方形,这种端点的形状与butt 的端点形状十分相似,只是结尾的线条略微的长些。
*/ const CGPoint points1[] = { CGPointMake(, ),
CGPointMake(, )
};
CGContextSetLineCap(ctx, kCGLineCapRound);
CGContextStrokeLineSegments(ctx, points1, ); const CGPoint points2[] = { CGPointMake(, ),
CGPointMake(, ),
};
CGContextSetLineCap(ctx, kCGLineCapSquare);
CGContextStrokeLineSegments(ctx, points2, ); const CGPoint points3[] = { CGPointMake(, ),
CGPointMake(, ),
};
CGContextSetLineCap(ctx, kCGLineCapButt);
CGContextStrokeLineSegments(ctx, points3, ); #pragma mark 下面测试点、线模式 /* <点线模式的理解>
使用Quartz 2D绘制线段或边框时,默认总是使用实线。如果希望使用点线进行绘制,可调用CGContextRef的CGContextSetLineDash(CGContextRef c,CGFloat phase, const CGFloat lengths[],size_t count)函数进行设置,该函数的第3个参数是点线模式的关键,该参数是一个CGFloat型数组(第4个参数通常用于指定该数组的长度),每个CGFloat值依次控制点线的实线长度、间距。比如该参数如下。 {2,3}:代表长为2的实线、距离为3的间距、长为2的实线、距离为3的间距……这种点线模式。 {2,3,1}:代表长为2的实线、距离为3的间距、长为1的实线、距离为2的间距、长为3的实线、距离为1的间距……这种点线模式。 {5,3,1,2}:代表长为5的实线、距离为3的间距、长为1的实线、距离为2的间距、长为5的实线、距离为3的间距、长为1的实线、距离为2的间距……这种点线模式。 通过第2个参数依次指定点线模式的实线长度、间距的重复模式,这样可以定义出任意形状的点线。 该方法的第2个参数用于指定点线的相位,该参数将会与第3个参数协同起作用,比如如下参数参数组合。 phase=1, lengths={2,3}:代表长为2的实线、距离为3的间距、长为2的实线、距离为3的间距。但开始绘制起点时只绘制长度为1的实线,因为phase为1就是控制该点线"移过"1个点。 phase=3, {5,3,1,2}:代表长为5的实线、距离为3的间距、长为1的实线、距离为2的间距、长为5的实线、距离为3的间距、长为1的实线、距离为2的间距。但开始绘制时只绘制长度为2的实线,因为phase为3就是控制该点线"移过"3个点。 */ // 设置颜色为红色
CGContextSetStrokeColorWithColor(ctx, [UIColor redColor].CGColor);
// ----------下面绘制3个线段测试点线模式-----------
// 设置线段的端点形状
CGContextSetLineCap(ctx, kCGLineCapButt);
// 设置线宽
CGContextSetLineWidth(ctx, );
CGFloat patterns1[] = { , };
// 设置点线模式:实线宽6,间距宽10
CGContextSetLineDash(ctx , , patterns1 , );//4为相位,理解为向左移动4个像素;最后一个参数 1 代表CGfloat 类型的数组的长度。 // 定义2个点,绘制线段
const CGPoint points4[] = {CGPointMake( , ), CGPointMake( , )};
// 绘制线段
CGContextStrokeLineSegments(ctx ,points4 , );
// 设置点线模式:实线宽6,间距宽10,但第一个实线宽为3
CGContextSetLineDash(ctx , , patterns1 , ); // 定义2个点,绘制线段
const CGPoint points5[] = {CGPointMake( , ), CGPointMake( , )};
// 绘制线段
CGContextStrokeLineSegments(ctx ,points5 , );
CGFloat patterns2[] = {,,,,,,,,,,,,,,,,,};
// 设置点线模式
CGContextSetLineDash(ctx , , patterns2 , ); const CGPoint points6[] = {CGPointMake( , ), CGPointMake( , )};
// 绘制线段
CGContextStrokeLineSegments(ctx ,points6 , ); #pragma mark 下面测绘制矩形边框
// 取消设置点线模式
CGContextSetLineDash(ctx, , , );
// 设置颜色为蓝色
CGContextSetStrokeColorWithColor(ctx, [UIColor blueColor].CGColor);
// 绘制一个矩形的边框
CGContextStrokeRectWithWidth(ctx, CGRectMake(, , , ), );
// 设置线条的链接形状
CGContextSetLineJoin(ctx, kCGLineJoinMiter); #pragma mark 下面测绘制填充一个椭圆
// 绘制椭圆
CGContextStrokeEllipseInRect(ctx, CGRectMake(, , , ));
// 设置椭圆环颜色
CGContextSetStrokeColorWithColor(ctx, [UIColor blackColor].CGColor); // 设置阴影以及模糊程度
CGContextSetShadow(ctx, CGSizeMake(, ), 0.1);
// 填充一个椭圆
CGContextFillEllipseInRect(ctx , CGRectMake( , , , ));
// 抗锯齿,图形光滑边缘
CGContextSetShouldAntialias(ctx, YES); } @end

效果截图为:

Quartz 2D(常用API函数、绘制图形、点线模式)的更多相关文章

  1. Delphi 常用API 函数

    Delphi 常用API 函数 AdjustWindowRect 给定一种窗口样式,计算获得目标客户区矩形所需的窗口大小 AnyPopup 判断屏幕上是否存在任何弹出式窗口 ArrangeIconic ...

  2. Delphi 常用API 函数列表

    Delphi 常用API 函数 AdjustWindowRect 给定一种窗口样式,计算获得目标客户区矩形所需的窗口大小AnyPopup 判断屏幕上是否存在任何弹出式窗口ArrangeIconicWi ...

  3. C语言实现单链表,并完成链表常用API函数

    C语言实现单链表,并完成链表常用API函数: 1.链表增.删.改.查. 2.打印链表.反转打印.打印环形链表. 3.链表排序.链表冒泡排序.链表快速排序. 4.求链表节点个数(普通方法.递归方法). ...

  4. Quartz 2D编程指南(2) - 图形上下文

    一个Graphics Context表示一个绘制目标.它包含绘制系统用于完成绘制指令的绘制参数和设备相关信息.Graphics Context定义了基本的绘制属性,如颜色.裁减区域.线条宽度和样式信息 ...

  5. C#常用 API函数大全

    常用Windows API1. API之网络函数WNetAddConnection 创建同一个网络资源的永久性连接WNetAddConnection2 创建同一个网络资源的连接WNetAddConne ...

  6. Delphi 常用API 函数(好多都没见过)

    AdjustWindowRect 给定一种窗口样式,计算获得目标客户区矩形所需的窗口大小AnyPopup 判断屏幕上是否存在任何弹出式窗口ArrangeIconicWindows 排列一个父窗口的最小 ...

  7. C# 窗体常用API函数 应用程序窗体查找

    常用的处理窗体的API函数如下(注意:API函数必须放在窗体中...): 使用C#语言,要引用DllImport,必须要添加using System.Runtime.InteropServices命名 ...

  8. C++实现VPN工具之常用API函数

    RAS是Remote Access Service的缩写,意为:远程访问服务,主要用来配置企业的远程用户对企业内部网络访问,包括拨号访问和vpn方式.微软的所有Windows平台中都有RAS客户机,它 ...

  9. 【总结】设备树语法及常用API函数【转】

    本文转载自:http://blog.csdn.net/fengyuwuzu0519/article/details/74352188 一.DTS编写语法   二.常用函数 设备树函数思路是:uboot ...

随机推荐

  1. 深入GCD(四):使用串行队列实现简单的预加载

    其主要思路是使用gcd创建串行队列,然后在此队列中先后执行两个任务:1.预加载一个viewController 2.将这个viewController推入代码如下:@implementation DW ...

  2. 利用背景流量数据(contexual flow data) 识别TLS加密恶意流量

    识别出加密流量中潜藏的安全威胁具有很大挑战,现已存在一些检测方法利用数据流的元数据来进行检测,包括包长度和到达间隔时间等.来自思科的研究人员扩展现有的检测方法提出一种新的思路(称之为“dataomni ...

  3. Codeforces Round #266 (Div. 2) C. Number of Ways

    You've got array a[1], a[2], ..., a[n], consisting of n integers. Count the number of ways to split ...

  4. Spring -- Bean自己主动装配&amp;Bean之间关系&amp;Bean的作用域

    对于学习spring有帮助的站点:http://jinnianshilongnian.iteye.com/blog/1482071 Bean的自己主动装配 Spring IOC 容器能够自己主动装配 ...

  5. linux字符设备驱动程序框架(老方法)

    #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #inclu ...

  6. weex 项目开发(一) weex create project 与 weex init project 的区别

    开发环境配置:http://www.cnblogs.com/crazycode2/p/7822961.html 1. weex create project  与  weex init project ...

  7. mysql 安装与启动

    1.下载mysql installer 2.安装 一直点next,直到finish. 3.安装时的配置 安装完后,选择立即开始配置. 选择standard configuration 勾选安装mysq ...

  8. Multiple analytic account plans多辅助核算方案

    定义核算方案     菜单 会计/设置/辅助核算会计/多个方案         点击"创建"按钮         说明 辅助核算方案,输入方案名称     点击"添加一个 ...

  9. Loadrunner IP欺骗

    一.为什么要设置IP欺骗 1. 当某个IP的訪问过于频繁,或者訪问量过大时,server会拒绝訪问请求.这时候通过IP欺骗能够添加訪问频率和訪问量,以达到压力測试的效果. 2. 某些server配置了 ...

  10. iOS 相似淘宝商品详情查看翻页效果的实现

    基本思路: 1.设置一个 UIScrollView 作为视图底层,而且设置分页为两页 2.然后在第一个分页上加入一个 UITableView 而且设置表格可以上提载入(上拉操作即为让视图滚动到下一页) ...