iOS上使用Quartz 2D绘制简单图形

    绘制图形是经过重载UIView的- (void)drawRect:(CGRect)rect方法来实现的,因此首先须要一个继承自UIView的类,而后重写这个类的- (void)drawRect:(CGRect)rect方法。当咱们使用这个类的对象时,view显示时回调自身的drawRect方法,从而把咱们会绘制在view上的东西呈现出来。drawRect方法只有一个CGRect 参数传入,这个值是view的frame。数组

   一、绘制直线:spa

CGContextRef context = UIGraphicsGetCurrentContext();  //首先构建一个context,全部绘制都须要的
        CGContextSetLineWidth(context, 2.0);  //设置线条的宽度
        CGContextSetStrokeColorWithColor(context, [UIColor brownColor].CGColor); //设置线条的颜色
        
        CGContextMoveToPoint(context, 10, 10);     //移动到某个点
        CGContextAddLineToPoint(context, CGRectGetMaxX(rect)-10, 10); //添加一条线,后两个参数提供一个新的点的坐标,结合上面的点,构成一条线段的两端。
        
        CGContextStrokePath(context);   //最后,绘制整个路径,前面的一系列移动、添加线条、点之类的能够说提供了一个路径,而后经过这个方法,把路径绘制出来。
    context,个人理解中,它是一个配置参数的集合,好比线条颜色、线条宽度,一直绘制过程的整个路径都包含在里面,它贯通了整个绘制的过程,把各个参数结合到一块儿。

   而绘制的过程,其实很形象,好比上面绘制线段,能够想象是一支笔,先移动到点(10,10),而后移动到(CGRectGetMaxX(rect)-10, 10),可是方法是AddLine,也就是这个从一个点到另外一个点得过程是构成一条线段的,就像是说你是按直线画过去的。3d

  二、绘制矩形:code

   使用上面的绘制线段的方法固然能够拼接出一个矩形,可是矩形也有单独的方法。
对象

CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextSetLineWidth(context, 2.0);
        CGContextSetStrokeColorWithColor(context, [UIColor brownColor].CGColor);
        
        CGContextAddRect(context, CGRectMake(10, 10, CGRectGetWidth(rect)-20, CGRectGetHeight(rect)-20));//就这一句话能够了,传入一个CGRect类型变量,提供矩形的范围,按这个范围画出矩形。
        
        CGContextStrokePath(context);
  三、绘制椭圆:
<span style="font-size:14px;">CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextSetLineWidth(context, 2.0);
        CGContextSetStrokeColorWithColor(context, [UIColor brownColor].CGColor);
        
        CGContextAddEllipseInRect(context, CGRectMake(10, 10, CGRectGetWidth(rect)-20, CGRectGetHeight(rect)-100));</span><pre name="code" class="objc"><span style="font-size:14px;">//这个方法一样只提供了一个CGRect变量,也就是一个矩形区域,绘制出的椭圆和这个矩形四边相切。</span><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:12px;">椭圆的形状靠长短轴的大小能够肯定下来,矩形的长宽提供了,而矩形的中心肯定了椭圆的中心,这样椭圆就能够肯定下来了。</span></span>
CGContextStrokePath(context);

 
四、绘制圆形: 
CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextSetLineWidth(context, 2.0);
        CGContextSetStrokeColorWithColor(context, [UIColor brownColor].CGColor);
        CGContextAddArc(context, 160, 200, 100, M_PI/3.0, M_PI/2.0, 1);//绘制圆弧

        CGContextStrokePath(context);

CGContextAddArc 方法实际是一个绘制圆弧的方法,第一个参数传入context,第二个和第三个参数构成圆弧圆心的坐标,第四个参数是圆弧的半径,第五个参数是圆弧的开始角度,第六个参数是圆弧的结束角度,最后一个参数用来指定圆弧的方向,本来传入0是逆时针、1是顺时针,可是由于Quartz 2D的坐标系和UIView的坐标系是y轴相反的,因此1是逆时针、0是顺时针。跳帧传入的起始、结束角度能够画出完整的圆。继承

绘制圆弧还有一个方法:ip

CGContextMoveToPoint(context, 10, 10);  //提供一个当前所在点
        CGContextAddArcToPoint(context, 10, 160, 40, 160,100);//绘制圆弧

这里的思路是,首先有三个点,假设为A,B,C,而后链接A,B构成一条线,B,C链接构成另外一条线,并且两线交于B点,而后就画一个圆弧分别与两条线相切,而且半径等于指定的半径。因此须要3个点和一个半径。CGContextAddArcToPoint这个方法第二个和第三个参数提供一点B的坐标,第三个和第四个提供点C的坐标,而这是须要一个点A,当前点就是点A,因此须要一个当前点。it

五、贝塞尔曲线:

 CGContextAddCurveToPoint(CGContextRef c, CGFloat cp1x,
  CGFloat cp1y, CGFloat cp2x, CGFloat cp2y, CGFloat x, CGFloat y)
贝塞尔曲线须要提供四个点,曲线的两个端点以及分别靠近两个端点的两个控制点,一样在调用这个绘制曲线的方法时,也须要有一个当前点,这个当前点会做为曲线的一个端点。方法最后两个参数构成另一个端点的坐标。而后第2、第三和第4、第五个参数分别构成两个控制点。控制点并不处在曲线上。经过调节控制点,能够调节曲线的样式,从而知足对于各类曲线的要求。

六、绘制虚线:class

CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextSetLineWidth(context, 2.0);
        const CGFloat lengths[] = {16.0f,6.0f,30.0f,40.0f};
        CGContextSetLineDash(context, 0, lengths, 4); //设置虚线的样式
        CGContextSetStrokeColorWithColor(context, [UIColor brownColor].CGColor);
        
        CGContextAddRect(context, CGRectMake(10, 10, CGRectGetWidth(rect)-20, CGRectGetHeight(rect)-20));
        
        CGContextStrokePath(context);
这里使用虚线绘制了一个矩形,虚线其实只需设置线条的属性便可,和上面说的图形绘制是两个不一样方面的问题,能够同时使用。

对于虚线,关键的方法是 CGContextSetLineDash,定义为:
void CGContextSetLineDash (
   CGContextRef c,
   CGFloat phase,
   const CGFloat lengths[],
   size_t count
);
lengths是一个float类型数组,count是数组里元素的数量。lengths指出了虚线的样式,例如
{16.0f,6.0f,30.0f,40.0f}
就是先长度为16的实线,而后空长度6,再是长度30的实线,再是空缺40长度,而后循环这个过程。
相关文章
相关标签/搜索