您的位置:首页 > 移动开发 > IOS开发

iOS核心绘图中的矩阵操作

2016-05-14 00:14 225 查看
给上下文做矩阵变换的注意点:

矩阵变换的实质上是对上下文进行了旋转,缩放,平移

获取上下文后就进行操作,但注意要放在添加路径之前

1.获取上下文

CGContextRef ctxR=UIGraphicsGetCurrentContext();


3.矩阵操作,(必须放在拼接路径之前)

//旋转
CGContextRotateCTM(ctxR,M_PI_4);
//缩放
CGContextScaleCTM(ctxR, 1, 0.5);
//平移
//CGContextTranslateCTM(ctxR, 100, 100);


思考:为什么旋转之后只显示了部分内容,和我们想象中的效果不太一样?

2.拼接路径(两种方法)

//2.1拼接路径(方法一:)
//画一个圆
CGContextAddArc(ctxR, 150, 150, 100, 0, 2*M_PI, 0);
//画一条线
CGContextMoveToPoint(ctxR, 0, 0);
CGContextAddLineToPoint(ctxR, 300, 300);


//提示:在画图时,方法内部默认创建了一个path,使用方法一,系统直接把我们创建的路径都放到了那个path里面

// 2.2拼接路径(方法二:)
CGMutablePathRef path=CGPathCreateMutable();
//画一个圆
CGPathAddArc(path, NULL, 150, 150, 100, 0, M_PI *2 , 1);
//画一条线
CGPathMoveToPoint(path, NULL, 0, 0);
CGPathAddLineToPoint(path, NULL, 300, 300);

//添加路径到上下文中
CGContextAddPath(ctxR, path);


//这里我们自己创建了一个可变的path,直接在这个路径内绘制路径,然后把这个path添加到上下文中

//注意:但凡通过Quartz2D中带有creat/copy/retain方法创建出来的值都必须要释放

思考:直接使用自定义path的好处是什么?为什么自己创建path?

4.设置上下文的属性

//设置线宽和颜色
CGContextSetLineWidth(ctxR, 20);
[[UIColor redColor]set];


5.渲染

CGContextStrokePath(ctxR);


回忆:渲染这句代码就做了哪些事情?

6.释放创建的路径

//CGPathRelease(path);
CFRelease(path);


说明:CFRelease属于更底层的cocafoundation框架

思考:为什么旋转之后只显示了部分内容,和我们想象中的效果不太一样?

因为旋转的是图形上下文,旋转45º后,画布(上下文)最开始的(0,0)那个点跑到了上面,画布旋转成了“菱形”,此时要显示在的是一个300X300的view,所以获取上下文时,获取的是一个以顶部点(0,0)宽高300的画布,所以形状没显示全。


思考:直接使用自定义path的好处是什么?什么时候自己创建path?

第一种代码的阅读性不好,不便于区分。使用自定义path,则一个path就代表一条路径。
比如:如果要在上下文中绘制多个图形,这种情况下建议使用自定义path。
//提示:如果是画线,那么就创建一条路径(path)用来保存画线的绘图信息,如果又要重新画一个圆,那么就可以创建一条新的路径来专门保存画圆的绘图信息。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios UI设计 核心绘图