给上下文做矩阵变换的注意点:
矩阵变换的实质上是对上下文进行了旋转,缩放,平移
获取上下文后就进行操作,但注意要放在添加路径之前
1.获取上下文
CGContextRef ctxR=UIGraphicsGetCurrentContext();
3.矩阵操作,(必须放在拼接路径之前)
//旋转
CGContextRotateCTM(ctxR,M_PI_4); //旋转45度
//缩放
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)用来保存画线的绘图信息,如果又要重新画一个圆,那么就可以创建一条新的路径来专门保存画圆的绘图信息。