学习iOS有一段时间了,在博客园也默默的潜水了两个月,见识了很多大神,收获不少。

今天整理笔记,发现忘记的不少,我感觉需要及时的整理一下了,同时也把做的小东西贴上来和大家分享一下。

最近学习了Quartz2D,一款二维绘图引擎,可以用于绘制各种图形、文字、图片等,并且具备裁剪、生成图片、自定义UI控件等功能,据说iOS很多UI控件都是通过它画出来的。

但是在美工如此强大的今天,并不需要利用Quartz2D画出多么美观的界面,而是利用它来做一些程序运行时美工无法实现或者相对麻烦的功能,比如动态绘图(涂鸦板、K线图等各种分析类图表)、裁剪图片、手势解锁等。

出于一个曾经美工的执念,我使用Quartz2D画了一个简单的机器猫头像,关于Quartz2D的基础绘制知识,博客园很多,我就直接贴出绘制过程了;

1、我是直接新建了一个view,直接在drawRect方法中取得图层上下文进行绘制,也可以直接创建一个基于位图的上下文,从上下文中取得制作完毕的UIImage对象。首先获取和view相关的图形上下文,设定线条样式,并且保存了一份在上下文栈中,以防后面需要用到。其中每个部分的位置参数,就不仔细说明了,简单计算和尝试即可,每个人都有自己的设置方法;注意要把描边厚度考虑进去,线段厚度设置方式是里外各增加相同厚度,我这里设置的线段厚度为4,比如大圆的实际半径为:我们设置的大圆半径加上2才是正确的,所以有些参数+-2;

-(void)drawRect:(CGRect)rect
{
//获取上下文,no *;
CGContextRef ctx = UIGraphicsGetCurrentContext();
//设置线宽为4,即描边
CGContextSetLineWidth(ctx, );
//线条颜色为黑色
[[UIColor blackColor]setStroke];
//保存一份原始的上下文栈
CGContextSaveGState(ctx);

2、开始画头部:头部由两个圆形组成。一个蓝色大圆,以及中心点靠下的白色小圆:

    //设置中心点,根据中心点设置参数
CGFloat viewW = self.frame.size.width * 0.5;
CGFloat viewH = self.frame.size.height * 0.5;
//蓝色大圆,画圆我一般喜欢画一条360度的弧线,这样是通过设置圆心位置来决定圆的位置。直接采用画圆的方法是根据左上角的顶点来设定位置;
CGContextAddArc(ctx, viewW, viewH, , , M_PI * , );
//设置圆的填充色,我根据取色器的数据设置的
[[UIColor colorWithRed: / 255.0 green: / 255.0 blue: / 255.0 alpha:] setFill];
//使用这个方法渲染,可以渲染出描边。
CGContextDrawPath(ctx, kCGPathFillStroke);
//小圆,圆心稍微向下,半径变小
CGContextAddArc(ctx, viewW, viewH + , , , M_PI * , );
[[UIColor whiteColor]setFill];
CGContextDrawPath(ctx, kCGPathFillStroke);

3、画领带:

    //红色矩形,也可以直接画一条很粗的线段
CGContextAddRect(ctx, CGRectMake(viewW - , viewH + , , ));
[[UIColor redColor]setFill];
CGContextDrawPath(ctx, kCGPathFillStroke);

效果;

4、画眼睛、眼珠。都是由圆形构成,位置设置需要计算一下子;眼睛是对称的,画好一个,把X值对称一下就行了

 //眼睛是椭圆的,采用的是画圆的方式,此时圆的位置由左上角决定;CGRectMake:前两个参数为左上角位置;后两个参数代表圆宽和长,设置不同参数形成椭圆;
[[UIColor whiteColor]setFill];
CGContextAddEllipseInRect(ctx, CGRectMake(viewW, viewH - , , ));
CGContextAddEllipseInRect(ctx, CGRectMake(viewW - , viewH - , , ));
CGContextDrawPath(ctx, kCGPathFillStroke);
//眼珠
[[UIColor blackColor]setFill];
CGContextAddEllipseInRect(ctx, CGRectMake(viewW + , viewH - , , ));
CGContextAddEllipseInRect(ctx, CGRectMake(viewW - , viewH - , , ));
CGContextFillPath(ctx);
//鼻子
[[UIColor redColor]setFill];
CGContextAddArc(ctx, viewW, viewH - , , , M_PI * , );
CGContextDrawPath(ctx, kCGPathFillStroke);

这样稍微有点机器猫的样子了;计算位置不用急,算不出来多试几次都能出来;

5、嘴巴、胡须的绘制;

 //鼻子下面的竖线
CGContextMoveToPoint(ctx, viewW, viewH - );
CGContextAddLineToPoint(ctx, viewW, viewH + );
CGContextStrokePath(ctx);
//嘴巴,曲线需要通过贝塞尔曲线绘制,和画线段一样,需要设置一个起点,然后再设置终点和一个控制点来设置弯曲程度;控制点离线段越远弯曲越大;
CGContextMoveToPoint(ctx, viewW + , viewH + );
CGContextAddQuadCurveToPoint(ctx, viewW, viewH + , viewW - , viewH + );
CGContextStrokePath(ctx);
//胡须,由线段构成,画好一边的另一边就出来了;
CGContextMoveToPoint(ctx, viewW + , viewH - );
CGContextAddLineToPoint(ctx, viewW + , viewH - );
CGContextMoveToPoint(ctx, viewW + , viewH - );
CGContextAddLineToPoint(ctx, viewW + , viewH - );
CGContextMoveToPoint(ctx, viewW + , viewH + );
CGContextAddLineToPoint(ctx, viewW + , viewH + ); CGContextMoveToPoint(ctx, viewW - , viewH - );
CGContextAddLineToPoint(ctx, viewW - , viewH - );
CGContextMoveToPoint(ctx, viewW - , viewH - );
CGContextAddLineToPoint(ctx, viewW - , viewH - );
CGContextMoveToPoint(ctx, viewW - , viewH + );
CGContextAddLineToPoint(ctx, viewW - , viewH + ); CGContextStrokePath(ctx);

这样机器猫大体形状就出来了

6、最后一步剪切掉多余的部分,在一开始就设置上绘制范围,这样只有在这个范围的绘图才会显示

     //画裁剪范围,将这段代码放在绘制绘制大圆的前面
CGContextAddRect(ctx, CGRectMake(viewW - , viewH - , , ));
CGContextClip(ctx);

这样就绘制完成了,然后多谢各位大神指正;

Quartz2D之绘制一个简单的机器猫的更多相关文章

  1. opengl学习笔记(五):组合变换,绘制一个简单的太阳系

    创建太阳系模型 描述的程序绘制一个简单的太阳系,其中有一颗行星和一颗太阳,用同一个函数绘制.需要使用glRotate*()函数让这颗行星绕太阳旋转,并且绕自身的轴旋转.还需要使用glTranslate ...

  2. svg绘制一个简单地饼图

    一个简单地svg绘制饼图的demo,代码如下 <!DOCTYPE html> <html> <head> <meta charset="UTF-8& ...

  3. 如何使用openscad绘制一个简单的键帽.

    1 新建空项目 2测数据 测量得出数据.这个长方体的长宽高分别是1.6.4.6.8 注意,这三个数据并不是测量得到的数据,而且加了一点公差值(为3D打印做准备) 3画图 写代码 导入模型 为了方便以后 ...

  4. Unity3D学习笔记2——绘制一个带纹理的面

    目录 1. 概述 2. 详论 2.1. 网格(Mesh) 2.1.1. 顶点 2.1.2. 顶点索引 2.2. 材质(Material) 2.2.1. 创建材质 2.2.2. 使用材质 2.3. 光照 ...

  5. VC6下OpenGL 开发环境的构建外加一个简单的二维网络棋盘绘制示例

    一.安装GLUT 工具包 GLUT 不是OpenGL 所必须的,但它会给我们的学习带来一定的方便,推荐安装. Windows 环境下的GLUT 本地下载地址:glut-install.zip(大小约为 ...

  6. iOS:quartz2D绘图(画一些简单的图形,如直线、三角形、圆、矩形、文字等)

    前一篇几乎已经详细介绍了Quartz2D的所有知识,这一篇以及后面就不废话了,主要是用具体的实例来演示绘图效果. 这里我们先来绘制一些简单的图形(如直线.三角形.圆.矩形.文字.图像),它有两种方式可 ...

  7. 如何开发一个简单的HTML5 Canvas 小游戏

    原文:How to make a simple HTML5 Canvas game 想要快速上手HTML5 Canvas小游戏开发?下面通过一个例子来进行手把手教学.(如果你怀疑我的资历, A Wiz ...

  8. 使用canvas绘制一个时钟

    周末学习canvas的一些基础功能,顺带写了一个基础的时钟.现在加工一下,做的更好看一点,先放上效果图: 谈一些自己的理解: (1).要绘制一个新的样式(不想被其他样式影响,或者影响到其他样式),那么 ...

  9. iOS----自定义UIView,绘制一个UIView

    绘制一个UIVIew最灵活的方式就是由它自己完成绘制.实际上你不是绘制一个UIView,你只是子类化了UIView并赋予子类绘制自己的能力.当一个UIVIew需要执行绘图操作的时,drawRect:方 ...

随机推荐

  1. Java_DOM创建XML

    import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream; ...

  2. web.config 配置

    一.认识Web.config文件   Web.config 文件是一个xml文本文件,它用来储存 asp.NET Web 应用程序的配置信息(如最常用的设置asp.NET Web 应用程序的身份验证方 ...

  3. Asp.net Web API 返回Json对象的两种方式

    这两种方式都是以HttpResponseMessage的形式返回, 方式一:以字符串的形式 var content = new StringContent("{\"FileName ...

  4. jpa遇到的 org.hibernate.PersistentObjectException: detached entity passed to persist异常

    jpa遇到的 org.hibernate.PersistentObjectException: detached entity passed to persist异常 发生这个原因是因为我们已经在实体 ...

  5. java 终端练习

    Java第一天笔记 一.Window中常见的dos命令 在哪里操作dos命令: Win7 ---> 开始  ---->所有程序--->附件---->命令提示符 Win7--&g ...

  6. 第三章 Git使用入门

    我们都知道Linux和Android是开源的.Linux下的软件很多都不直接以二进制形式的安装包提供,而是直接提供了源代码,为了减少发行包的大小,用户须先下载源代码,在本机上编译并安装,使用make. ...

  7. table-responsive响应式表格,HTML表格自适应,bootstrap2表格自适应

    引用bootstrap3 的方法 @media (max-width: 767px) { .table-responsive { width: 100%; margin-bottom: 15px; o ...

  8. React学习——ListView(Reflux)

    接前一篇,把前面的ListView改成Reflux的形式 var BookActions=Reflux.createActions([ 'fetchList' ]); var BookStore = ...

  9. java开发模式学习

    1.瀑布模式 这种模式适合小项目,一层层进行编码,没有规模的设计, 2.原型模式 先做模板给客户在做实体 3.面向对象模式 用面向对象的思想进行开发 4.螺旋模式 从内到外一层层开,

  10. Ubuntu 16.04 软件中心闪退 解决方案

    最近使用16.04不知道是哪里出了问题,软件中心打不开了,点击图标之后完全不显示GUI,过一会儿软件就自动关闭了,然后也没有报错的log. 虽然可以使用命令行升级,但是强迫症不能忍啊. 经过一番折腾, ...