IOS开发入门之iOS Quartz 2D绘图知识详解
白羽 2018-11-19 来源 :网络 阅读 1044 评论 0

摘要:本文将带你了解IOS开发入门iOS Quartz 2D绘图知识详解,希望本文对大家学IOS有所帮助。

    本文将带你了解IOS开发入门iOS Quartz 2D绘图知识详解,希望本文对大家学IOS有所帮助。



        

* Quartz*
1.  Mac OS X的Darwin核心之上的绘图层,有时候也认为是CoreGraphics。共有两种部分组成Quartz:
2.  Quartz Compositor,合成视窗系统,管理和合成幕后视窗影像来建立Mac OS X使用者接口。
3. Quartz 2D,是iOS和Mac OS X环境下的二维绘图引擎。
涉及内容包括:基于路径的绘图,透明度绘图,遮盖,阴影,透明层,颜色管理,防锯齿渲染,生成PDF,以及PDF元数据相关处理。

*一、Quartz 2D的简单介绍**
1.  Quartz 2D属于Core Graphics(所以大多数相关方法的都是以CG开头),是iOS/Mac OSX 提供的在内核之上的强大的2D绘图引擎,并且这个绘图引擎是设备无关的。也就是说,不用关心设备的大小,设备的分辨率,只要利用Quartz 2D,这些设备相关的会自动处理。
**2.**Quartz 2D能够提供的强大功能如下:


   

1. 透明层(transparency layers) 

2. 阴影 基于path的绘图(path-based drawing)

3. 离屏渲染(offscreen rendering) 

4. 复杂的颜色处理(advanced color management) 

5. 抗锯齿渲染(anti-aliased rendering)

6. PDF创建,展示,解析(这部分不在这个系列之中) 配合Core Animation, OpenGL ES,UIKit完成复杂的功能 画板-The Graphics Context

7. 而Quartz 2D的容器就是CGContextRef数据模型。这种数据模型是C的结构体,存储了渲染到屏幕上需要的一切信息。

   

二、Quartz 2D详解:

Quartz 2D的基本数据类型:
Quartz 2D中的数据类型都是透明的,也就是说用户只需要使用即可,不需要实际访问其中的变量。具体的数据类型包括


   

1. CGPathRef 路径类型,用来绘制路径(注意带有ref后缀的一般都是绘制的画板)

2. CGImageRef,绘制bitmap

3. CGLayerRef,绘制layer,layer可复用,可离屏渲染

4. CGPatternRef,重复绘制

5. CGShadingRef和CGGradientRef,绘制渐变(例如颜色渐变)

6. CGFunctionRef,定义回调函数,CGShadingRef和CGGradientRef的辅助类型

7. CGColorRef and CGColorSpaceRef,定义如何处理颜色

8. CGFontRef,绘制文字

   

Quartz 2D的坐标

UIKit默认的坐标系统与Quartz不同。在UIKit中,原点位于左上角,y轴正方向为向下。UIView通过将修改Quartz的Graphics Context的CTM[原点平移到左下角,同时将y轴反转(y值乘以-1)]以使其与UIView匹配。这些都是系统自动帮我们完成。

三、直线/矩形

基本图形绘制需要的属性


   

1.获取当前上下文(context)(UIGraphicsGetCurrentContext)

2.设置颜色:

    CGContextSetFillColorWithColor:设置描边颜色

    CGContextSetFillColorWithColor:设置填充颜色

3. 画的范围

    CGContextStrokeRect:描边的范围

    CGContextFillRect:填充的范围

4.CGContextSetLineWidth:线宽

5.CGContextSetLineCap:线顶端的样式

6.CGContextSetLineJoin:线拐角的样式

7. 线的起始点:

    CGContextMoveToPoint:起点 

    CGContextAddLineToPoint:终点

8.CGContextFillPath :填充的路径

9.CGContextStrokePath:描边的路径

   

直线、矩形 demo


   

- (void)drawRect:(CGRect)rect {

 

    //1.获得当前context

    CGContextRef context = UIGraphicsGetCurrentContext();

 

    //设置颜色 (填充色和 描边的颜色)

    CGContextSetFillColorWithColor(context, [UIColor colorWithWhite:0.8 alpha:1].CGColor);

    CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor);

 

    //设置描边线宽

    CGContextSetLineWidth(context, 20);

 

    //对矩形进行填色  或  描边

    //(注意:如果先描边再填充,由于矩形大小一致,那么描边的线就会被填充的矩形挡住)

    CGContextFillRect(context, rect);

    CGContextStrokeRect(context, rect);

 

    //-----------------------------------------------------------------

 

    //MARK: ------ 实际line和point的代码

    // 设置描边颜色

    CGContextSetStrokeColorWithColor(context, [UIColor yellowColor].CGColor);    CGContextSetLineWidth(context, 8.0);//线的宽度

    CGContextSetLineCap(context, kCGLineCapRound);//线的顶端

    CGContextSetLineJoin(context, kCGLineJoinRound);//线相交的模式

 

    //-----------------------------------------------------------------

    //MARK:黄色的  ">" 图形

    //移动画笔到哪个点

    CGContextMoveToPoint(context,20,20);

    //画笔画到哪个点

    CGContextAddLineToPoint(context, rect.size.width - 20, rect.size.height / 2 - 20);

    CGContextAddLineToPoint(context, 20, rect.size.height - 20);

    //根据上下文中的点,成线进行描边

    CGContextStrokePath(context);

 

    //------------------------------------------------------------------

    //MARK: 红色的小的三角的填充

    CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor);

    CGContextMoveToPoint(context, 0, rect.size.height / 2 - 30);

    CGContextAddLineToPoint(context, 30, rect.size.height / 2);

    CGContextAddLineToPoint(context, 0, rect.size.height / 2 + 30);

    CGContextFillPath(context);

   //虚线效果

  //CGContextSetLineDash(context, 1, lengths, 1);

 

 //------------------------------------------------------------------

    //MARK: 红色虚线效果

    CGContextSetStrokeColorWithColor(context,[UIColor redColor].CGColor);

    CGContextSetLineWidth(context, 1);

 

    CGContextMoveToPoint(context, rect.size.width - 20, 20);

    CGContextAddLineToPoint(context, rect.size.height - 20, rect.size.width - 20);

    CGFloat lengths[] = {20};

    CGContextSetLineDash(context, 1, lengths, 1);

    CGContextStrokePath(context);

}

   

运行之后的效果:

虚线效果

CGContextSetLineDash参数详解
void CGContextSetLineDash (
CGContextRef _Nullable c,
CGFloat phase,
const CGFloat * _Nullable lengths,
size_t count
);
c 绘制的context,这个不用多说
phase,第一个虚线段从哪里开始,例如传入3,则从第三个单位开始
lengths,一个C数组,表示绘制部分和空白部分的分配。例如传入[2,2],则绘制2个单位,然后空白两个单位,以此重复
count lengths的数量

四、曲线— 圆弧的绘制

Quartz提供了两个方法来绘制圆弧
1. CGContextAddArc,普通的圆弧一部分(以某圆心,某半径,某弧度的圆弧)
2. CGContextAddArcToPoint,用来绘制圆角

 


CGContextAddArc

 

 结构:
 void CGContextAddArc (
 CGContextRef _Nullable c,
 CGFloat x, // 圆心X坐标
 CGFloat y, // 圆心Y坐标
 CGFloat radius, // 弧度半径
 CGFloat startAngle, // 开始的弧度
 CGFloat endAngle, // 结束的弧度
 int clockwise //1表示顺时针,0表示逆时针
 );


   

- (void)drawRect:(CGRect)rect {

    //--------------------------------------------------------------------

    //MARK: 画弧

    //1.获取图片上下文

    CGContextRef context = UIGraphicsGetCurrentContext();

    //2.设置弧度及位置

     //根据中心点,半径,起始的弧度,最后的弧度,是否顺时针画一个圆弧

    CGContextAddArc(context, rect.size.width / 2, rect.size.height / 2, 20, M_PI_4, M_PI, 1);

    CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);

    //3.画

    CGContextDrawPath(context, kCGPathStroke);

 

    // -----------------------------------------------------

 

    //MARK:画有线圈的圆饼

    CGContextSetRGBStrokeColor(context, 1, 0, 0, 1);//设置线的颜色

    CGContextSetRGBFillColor(context, 0, 0, 1, 1);//设置填充颜色

    CGContextSetLineWidth(context, 2); //设置线的宽度

    CGContextAddEllipseInRect(context, CGRectMake(10, 30, 60, 60)); //画一个椭圆或者圆

    CGContextDrawPath(context, kCGPathFillStroke);

}

   

2.CGContextAddArcToPoint

void CGContextAddArcToPoint (
CGContextRef _Nullable c,
CGFloat x1,
CGFloat y1,
CGFloat x2,
CGFloat y2,
CGFloat radius
);
c context x1,y1和当前点(x0,y0)决定了第一条切线(x0,y0)->(x1,y1) x2,y2和(x1,y1)决定了第二条切线 radius,想切的半径。
也就是说,
绘制一个半径为radius的圆弧,和上述 两条直线都相切。



   

- (void)drawRect:(CGRect)rect {

    CGContextRef ctx = UIGraphicsGetCurrentContext();

    CGContextSetRGBStrokeColor(ctx, 1, 0, 0, 1);//设置线的颜色

    CGContextSetRGBFillColor(ctx, 0, 0, 1, 1);//设置填充颜色

    CGContextSetLineWidth(ctx, 2); //设置线的宽度

 

    //CGContextAddArcToPoint 先要确定三个点,

    //1.从哪里开始划线 CGContextMoveToPoint (也就是两条线的交点)

    //2.第二个点与起始点  确定一条直线

&n    

   

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之IOS频道!


本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved