[ios]ios画线 使用CGContextRef,CGPath和UIBezierPath来绘画
参考 :http://www.mgenware.com/blog/?p=493
这三种东西:CGContextRef
,CGPath
和UIBezierPath
。本质上都是一样的,都是使用Quartz来绘画。只不过把绘图操作暴露在不同的API层面上,在具体实现上,当然也会有一些细小的差别。
我们将主要使用这3个类型,绘制出同一张图片,如下,一个笑脸:
首先使用Quartz的CGPath
来做这张图。很简单,首先创建用于转移坐标的Transform,然后创建一个CGMutablePathRef
(属于CGPath
类型)对象。接着通过两个CGPathAddEllipseInRect
和一个CGPathAddArc
函数来绘制Path中的两个眼睛和一个嘴,注意把CGAffineTransform
的地址传进去,这样Transform才会应用。接着把这个创建好的CGPath
加入到当前CGContextRef
中,最后通过CGContextRef
执行绘画。
代码:
- (void)viewDidLoad
{
[super viewDidLoad]; //开始图像绘图
UIGraphicsBeginImageContext(self.view.bounds.size);
//获取当前CGContextRef
CGContextRef gc = UIGraphicsGetCurrentContext(); //创建用于转移坐标的Transform,这样我们不用按照实际显示做坐标计算
CGAffineTransform transform = CGAffineTransformMakeTranslation(, );
//创建CGMutablePathRef
CGMutablePathRef path = CGPathCreateMutable();
//左眼
CGPathAddEllipseInRect(path, &transform, CGRectMake(, , , ));
//右眼
CGPathAddEllipseInRect(path, &transform, CGRectMake(, , , ));
//笑
CGPathMoveToPoint(path, &transform, , );
CGPathAddArc(path, &transform, , , , , M_PI, NO);
//将CGMutablePathRef添加到当前Context内
CGContextAddPath(gc, path);
//设置绘图属性
[[UIColor blueColor] setStroke];
CGContextSetLineWidth(gc, );
//执行绘画
CGContextStrokePath(gc); //从Context中获取图像,并显示在界面上
UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext(); UIImageView *imgView = [[UIImageView alloc] initWithImage:img];
[self.view addSubview:imgView];
}
接下来,我们不去使用CGPath
类型的相关函数,而完全使用CGContextRef
相关的函数,这些函数执行起来其实是和上面讲的的CGPath
完全等价的。
这里需要注意的是,完全使用CGContextRef
的话,Transform的应用需使用CGContextTranslateCTM
函数。
完整代码:
- (void)viewDidLoad
{
[super viewDidLoad]; //开始图像绘图
UIGraphicsBeginImageContext(self.view.bounds.size);
//获取当前CGContextRef
CGContextRef gc = UIGraphicsGetCurrentContext(); //使用CGContextTranslateCTM函数来转移坐标的Transform,这样我们不用按照实际显示做坐标计算
CGContextTranslateCTM(gc, , );
//左眼
CGContextAddEllipseInRect(gc, CGRectMake(, , , ));
//右眼
CGContextAddEllipseInRect(gc, CGRectMake(, , , ));
//笑
CGContextMoveToPoint(gc, , );
CGContextAddArc(gc, , , , , M_PI, NO);
//设置绘图属性
[[UIColor blueColor] setStroke];
CGContextSetLineWidth(gc, );
//执行绘画
CGContextStrokePath(gc); //从Context中获取图像,并显示在界面上
UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageView *imgView = [[UIImageView alloc] initWithImage:img];
[self.view addSubview:imgView];
}
同样会绘制出上面的图形。
最后我们使用UIBezierPath
类型来完成上述图形,UIBezierPath
很有意思,它包装了Quartz的相关API,自己存在于UIKit
中,因此不是基于C的API,而是基于Objective-C对象的。那么一个非常重要的点是由于离开了Quartz绘图,所以不需要考虑Y轴翻转的问题,在画弧的时候,clockwise
参数是和现实一样的,如果需要顺时针就传YES
,而不是像Quartz环境下传NO
的。
其次椭圆的创建需使用bezierPathWithOvalInRect
方法,这里名字是Oral
而不是Quartz中的Ellipse
。
最后注意UIBezierPath
的applyTransform
方法需要最后调用。
完整代码:
- (void)viewDidLoad
{
[super viewDidLoad]; //开始图像绘图
UIGraphicsBeginImageContext(self.view.bounds.size); //创建UIBezierPath
UIBezierPath *path = [UIBezierPath bezierPath];
//左眼
[path appendPath:[UIBezierPath bezierPathWithOvalInRect:CGRectMake(, , , )]];
//右眼
[path appendPath:[UIBezierPath bezierPathWithOvalInRect:CGRectMake(, , , )]];
//笑
[path moveToPoint:CGPointMake(, )];
//注意这里clockwise参数是YES而不是NO,因为这里不知Quartz,不需要考虑Y轴翻转的问题
[path addArcWithCenter:CGPointMake(, ) radius: startAngle: endAngle:M_PI clockwise:YES];
//使用applyTransform函数来转移坐标的Transform,这样我们不用按照实际显示做坐标计算
[path applyTransform:CGAffineTransformMakeTranslation(, )];
//设置绘画属性
[[UIColor blueColor] setStroke];
[path setLineWidth:];
//执行绘画
[path stroke]; //从Context中获取图像,并显示在界面上
UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageView *imgView = [[UIImageView alloc] initWithImage:img];
[self.view addSubview:imgView];
}
[ios]ios画线 使用CGContextRef,CGPath和UIBezierPath来绘画的更多相关文章
- iOS: 使用CGContextRef,CGPath和UIBezierPath来绘画
这三种东西:CGContextRef,CGPath和UIBezierPath.本质上都是一样的,都是使用Quartz来绘画.只不过把绘图操作暴露在不同的API层面上,在具体实现上,当然也会有一些细小的 ...
- ios cocos2d 画线出现闪烁问题
根据http://www.merowing.info/2012/04/drawing-smooth-lines-with-cocos2d-ios-inspired-by-paper/ 用cocos2d ...
- [修复] Firemonkey 画线问题(Android & iOS 平台)
问题:官方 QC 的一个 Firemonkey 移动平台画线问题: RSP-14309: [iOS & Android] Delphi 10.1 Berlin - drawing proble ...
- IOS Quartz 各种绘制图形用法---实现画图片、写文字、画线、椭圆、矩形、棱形等
// Only override drawRect: if you perform custom drawing. // An empty implementation adversely affec ...
- IOS 绘制基本图形( 画圆、画线、画圆弧、绘制三角形、绘制四边形)
// 当自定义view第一次显示出来的时候就会调用drawRect方法- (void)drawRect:(CGRect)rect { // 1.获取上下文 CGContextRef ctx = UIG ...
- iOS小画板画线总结
一:基本画线: 使用贝赛尔曲线画: //创建路径 UIBezierPath* aPath = [UIBezierPath bezierPath]; //设置线宽 aPath.lineWidth = 5 ...
- [ios]MKMapView中使用MKPolyline画线
参考:http://blog.sina.com.cn/s/blog_9e8867eb0101dt76.html 首先在MapView.h中 #import <MapKit/MapKit.h> ...
- CGContextRef 画线简单用法
CGContextRef CGContextMoveToPoint(context,150,50);//圆弧的起始点 CGContextAddArcToPoint(context,100,80,130 ...
- IOS 股票K线图、分时图
IOS 股票K线图.分时图,网上开源项目很少,质量也是参差不齐:偶尔搜索到看似有希望的文章,点进去,还是个标题党:深受毒害.经过一段时间的探索,终于在开源基础上完成了自己的股票K线图.分时图: 先放出 ...
随机推荐
- jmeter 基础功能详解
jmeter 基础功能详解 thread group:包含一组线程,每个线程独立地执行测试计划. sampler:采样器,有多种不同的sample实现,用来发起各种请求,如http请求,jdbc请求, ...
- cocos代码研究(7)即时动作子类学习笔记
理论部分 即时动作是会立即被执行的动作.他们没有持续时间动作(ActionInterval)的持续时间属性.继承自 FiniteTimeAction.被 CallFunc, FlipX, FlipY, ...
- cocos代码研究(1)Node学习笔记
理论部分 Node类继承自Ref类,是cocos框架中基础底层的一个封装类,与画面渲染相关的类一般都是继承自该类,例如Scene,Layer,Sprite,Sprite3D,Label,SpriteB ...
- linux rz sz
对于经常使用Linux系统的人员来说,少不了将本地的文件上传到服务器或者从服务器上下载文件到本地,rz / sz命令很方便的帮我们实现了这个功能,但是很多Linux系统初始并没有这两个命令.今天,我们 ...
- 通俗理解RxJS(一)
自学 Rx 快有一个周了, 它非常适合处理复杂的异步场景.结合自己所学,决定写系列教程. 我认为, Rx 中强大的地方在于两处 管道思想,通过管道,我们订阅了数据的来源,并在数据源更新时响应 . 强大 ...
- java tar.gz文件生成
/** * 压缩文件成Gzip格式,Linux上可使用 * 压缩文件夹生成后缀名为".gz"的文件并下载 * @param folderPath,要压缩的文件夹的路径 * @par ...
- VS2010/MFC编程入门之三十五(菜单:菜单及CMenu类的使用)
鸡啄米在上一节中讲的是VS2010的菜单资源,本节主要讲菜单及CMenu类的使用. CMenu类的主要成员函数 MFC为菜单的操作提供了CMenu类,下面鸡啄米就常用的几个成员函数进行简单的介绍. B ...
- Java SE 基础知识(二)
1. 类由两大部分构成:属性和方法.属性一般用名词来表示,方法一般用动词来表示. 2. 如果一个java源文件中定义了多个类,那么这些类中最多只能有一个类是public的,可以都不是public的. ...
- 好用的在线web页面测试,移动页面测试工具webpagetest使用图文教程
好用的在线web页面测试,移动页面测试工具webpagetest使用图文教程 http://www.webpagetest.org/ 1.打开主页,输入网址,点击 START TEST 按钮开始测试 ...
- Antlr4 SQL Query 解析实例
grammar MysqlQuery; @header{package com.antlr.mysql.query;} AS : A S; SELECT : S E L E C T; FROM : F ...