这里交代一些作图时可能遇到的问题:

问题一:当同时画多条线时,在第一条线设置属性后,后面画的所有线都会延用这些属性来绘制。

        其实解决的方法很简答,就是在绘制一条新的线条时重置下绘制的属性即可,比如,在画第一条是的属性设置是:

        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)的点即可。

        当然了,正式项目中根据不同的需求,可以让图片显示在矩形、三角形或者其他各种形状里。