这里交代一些作图时可能遇到的问题:
问题一:当同时画多条线时,在第一条线设置属性后,后面画的所有线都会延用这些属性来绘制。
其实解决的方法很简答,就是在绘制一条新的线条时重置下绘制的属性即可,比如,在画第一条是的属性设置是:
CGContextSetLineWidth(ctx,12); //线条宽度
[[UIColor redColor]set]; //线条颜色
CGContextSetLineCap(ctx,kCGLineCapRound); //端点样式
在绘制第二条线时不想要延用这个属性继续绘制,那么可以重置这些属性:
CGContextSetLineWidth(ctx,1);
[[UIColor blackColor]set];
CGContextSetLineCap(ctx,kCGLineCapButt);
但是这样就出现了新的问题,如果绘制的线条过多,每次到新的线条都要重置属性,这样操作起来就会非常麻烦。当然了,苹果不可能没想到这样的问题,自然也有相应的解决方法了。不过在这之前我们要了解一个新的概念-----图形上下文栈:用于保存图形上下文的状态。
大体过程是:在设置完第一条线的绘制属性前,我们先保存一份最纯洁的图形上下文(此时是没有做过任何操作的图形上下文),然后设置完第一条线,到第二条线之前,我们拿出之前保存的图形上下文绘制,这样第二条线绘制的属性其实就是系统默认的属性了。
获取完图形上下文后,调用函数CGContextSaveGState(ctx);
在需要重置属性的线条前面调用函数CGContextRestoreGState(ctx);即可
非常简单的两部,但是要说明的是,每次保存都是一份,调用一次之后就没有了,如果要重置几次就保存几次,然后调用,如果调用次数大于保存次数会直接挂掉哟~
问题二:绘制矩形时如何让矩形旋转角度?
这样的情况我们在开发中可能会遇到,这个问题的解决就是使用系统自带的函数即可。
1、.....获取上下文,然后
2、CGContextRotateCTM(ctx,M_Pi_4);
3、....设置绘制属性
4、....渲染
以上方法用于旋转角度的属性设置,要注意的是:这里的旋转不是将绘制的图形旋转,而是将整个layer旋转,而所有的绘制都是在layer上进行的,所以这个函数要在绘制属性设置之前就调用,不然无效。
除了旋转以外,还有缩放和平移。
CGContextScaleCTM(ctx,x,y); //缩放(x代表宽的倍数,y代表高的倍数)
CGContextTranslateCTM(ctx,x,y); //平移(x、y分别代表x、y上的偏移量)
问题三:如何让绘制的图片显示成圆形?
解决这个问题的思路:先画一个圆形,把图片绘制在这个圆里面,超出这个圆形范围的部分不显示。具体的代码:
1、获取上下文...
2、CGContextAddEllipseInRect(ctx,CGRectMake(100,100,50,50)); //画一个圆心在(100,100),半径为50的圆形
//关键的一步
3、CGContextClip(ctx); //指定上下文中可以显示内容的就是上面画的图形的范围
4、把图片绘制到(100,100)的点即可。
当然了,正式项目中根据不同的需求,可以让图片显示在矩形、三角形或者其他各种形状里。