基本图形绘制Quartz2d的的使用

QuartZ2d是二维绘图引擎,包含在core Graphics框架中,是纯C语言的;

图形上下文:CGContextRef数据类型,包含以下信息:绘图路径,绘图状态,绘图输出目标;

注意:绘图的顺序对最终显示结果有影响;


1.当view第一次被显示的时候会调用d'ra'wRect:(CGRect )rect

2.不要手动调用drawRect:方法执行重绘,否则可能无法正确的获取图形上下文;

3.手动调用重绘的方法:setNeedsDisplay(全部重绘),steedsDisplayInRect(部分区域重绘);

4.rect表示当前view的bounds

5.只有在drawrect:方法中能获取当前view的图形上下文;

6.手动调用重绘的时候,内部会创建一个与当前view相关的图形上下文,然后再调用drawRect:方法实现重绘,绘制的的图形实际上是绘制到了view的图层上;



渲染模式:

空心-------strokePath

实心---------fillPath

填充--------EOFillPath


[path stroke];

CGContextDrawPath(ctx,KCGPathStroke);

CGContextStrokePath(ctx);


填充一个路径的时候,路径里面的子路径是独立填充的;决定一个点事否被填充有两个规则:

1.非零计数规则:一个点从左到右跨过,计数器+1,从右到左跨过计数器-1;结果为零就不填充,结果不为零就填充;

2.奇偶规则:一个点被跨过奇数次,就被填充,被跨过偶数次就不填充,和方向没关系.

==============================================


    //1.获取图形上下文对象

    CGContextRef ctx = UIGraphicsGetCurrentContext();

    

    //2.向图形上下文对象中添加路径

    CGContextMoveToPoint(ctx, 50, 50);

    

    //2.1添加线段

    CGContextAddLineToPoint(ctx, 150, 150);

    

    CGContextAddLineToPoint(ctx, 50, 150);

    

    //    CGContextAddLineToPoint(ctx, 50, 50);

    //关闭路径 (终点到起点连线)

    CGContextClosePath(ctx);

    

    //2.2 重新设置起点

    CGContextMoveToPoint(ctx, 50, 200);

    CGContextAddLineToPoint(ctx, 200, 200);

    

       绘制矩形路径,向上下文对象中添加路径

    CGContextAddRect(ctx, CGRectMake(50, 50, 150, 150));



    //3.渲染

    CGContextStrokePath(ctx);//空心

       

    CGContextFillPath(ctx);//填充


================================

   UIBezierPath是UIKit框架封装好的框架;


 //1.获取上下文对象

    CGContextRef ctx = UIGraphicsGetCurrentContext();

    

    //2.创建UIBezierPath对象

    UIBezierPath * path = [UIBezierPath bezierPathWithRect:CGRectMake(50, 50, 100, 100)];

    

    //3.把创建的UIBezierPath对象添加到上下文对象中

    CGContextAddPath(ctx, path.CGPath);//转换成CGPath

    

    //4.渲染

    CGContextDrawPath(ctx, kCGPathFill);


==========================

不用获取图形上下文,直接绘制

    //1.创建UIBezierPath对象

    UIBezierPath * path = [UIBezierPath bezierPathWithRect:CGRectMake(100, 100, 100, 100)];

    

    

    //2.渲染

    [path fill];


=======================================

创建UIBezierPath.并添加子路径

    //1.获取图形上下文对象

    CGContextRef ctx = UIGraphicsGetCurrentContext();

    

    //2.创建UIBezierPath路径对象

    UIBezierPath * path = [UIBezierPath bezierPath];

    //2.1 添加子路径

    //2.1.1 设置起点

    [path moveToPoint:CGPointMake(50, 50)];

    //2.1.2 添加线段

    [path addLineToPoint:CGPointMake(200, 200)];

    

    //2.1.3 再添加一个线段

    [path addLineToPoint:CGPointMake(50, 200)];

    

    //关闭路径

    [path closePath];

    

    //3.把创建好的UIBezierPath对象添加到图形上下文中

    CGContextAddPath(ctx, path.CGPath);

    

    

    //4.渲染

    

    CGContextDrawPath(ctx, kCGPathStroke);


======================================================

//通过画弧的方式绘制圆

    //1.获取图形上下文对象

    CGContextRef ctx = UIGraphicsGetCurrentContext();

    

    //2.创建路径

    //设置圆心

    CGPoint centerP = CGPointMake(150, 150);

    

    //设置半径

    CGFloat radius = 100.f;

    

    //设置起始弧度

    CGFloat start = 0;

    

    //设置结束弧度

    CGFloat end = M_PI_4;

    

    

    UIBezierPath * path = [UIBezierPath bezierPathWithArcCenter:centerP radius:radius startAngle:start endAngle:end clockwise:YES];

    

    //添加一条到圆心的线

    [path addLineToPoint:centerP];

    

    //关闭路径

    [path closePath];

    

    //3.把路径添加到图形上下文对象中

    CGContextAddPath(ctx, path.CGPath);

    

    //4.渲染

    CGContextDrawPath(ctx, kCGPathFill);


======================================================

绘制矩形:OC中的方法

    UIBezierPath * path = [UIBezierPath bezierPathWithRect:CGRectMake(50, 50, 100, 100)];

绘制圆角矩形:

UIBezierPath * path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(50, 50, 200, 200) cornerRadius:100];

绘制圆:

UIBezierPath * path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(50, 50, 200, 200)];


绘制圆弧:

UIBezierPath * path = [UIBezierPath bezierPathWithArcCenter:圆心 radius:半径 startAngle:起始弧度 endAngle:结束弧度 clockwise:YES];//YES表示顺时针


+++++++++++++++++++++++++++++++++++++++++++


绘制圆/椭圆:(C语言的方法)

CGContextAddEllipseInRect(ctx, CGRectMake(5050200200));

绘制矩形:

CGContextAddRect(ctx, CGRectMake(5050150150));

绘制圆弧/圆:

CGContextAddArc(ctx,   );

绘制填充样式的椭圆:

CGContextFillEllipseInRect(ctx,      );



总结:绘制圆形的方法有:圆弧,椭圆,圆角矩形都可以画出圆形;


==========================

绘图状态的设置:

设置线宽:

CGContextSetlineWidth(ctx,20);

path.lineWidth =20;

[path setLineWidth:20];


设置线的颜色:

         CGContextSetRGBStrokeColor(cox,1,0,1,1);

    [[UIColor redColor] setStroke];//设置stroke时的颜色

    [[UIColor redColor] setFill];//设置填充颜色

    [[UIColor redColor] set];//不管是空心还是填充都有效果


设置线头样式:

        CGContextSetLineCap(ctx,KCGlineCapButt);

    path.lineCapStyle = kCGLineCapSquare;

        [path setLineCapStytle:KCGLineCapRound];


//设置连接处样式

    CGContextSetLineJoin(ctx, kCGLineJoinRound);

    path.lineJoinStyle = kCGLineJoinBevel;

        [path setLineJoinStytle:KCGLineJoinBevel];


==============================

图形上下文矩阵操作-----------可以让图形上下文中的路径一起变化

    

  //缩放      CGContextScaleCTM(ctx, 0.5, 0.5);

   

 //旋转   CGContextRotateCTM(ctx, M_PI_4);

    

//平移   CGContextTranslateCTM(ctx, 200, 50);


=============================================

图像上下文栈的操作:

两个钟要的方法:

//1.获取图形上下文对象

    CGContextRef ctx = UIGraphicsGetCurrentContext();

2.

//在下一次绘图之前替换掉当前的图形上下文状态

    CGContextRestoreGState(ctx);


例如:


    //1.获取图形上下文对象

    CGContextRef ctx = UIGraphicsGetCurrentContext();

    

    //在绘图之前保存当前上下文状态

    CGContextSaveGState(ctx);

    

    //矩阵操作

    

    //缩放

    CGContextScaleCTM(ctx, 0.5, 0.5);

    

    //旋转

    CGContextRotateCTM(ctx, M_PI_4);

    

    //平移

    CGContextTranslateCTM(ctx, 200, 50);

    

    

    

    //2.创建路径

    UIBezierPath * path1 = [UIBezierPath bezierPathWithRect:CGRectMake(20, 50, 240, 100)];

    

    UIBezierPath * path2 = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(50, 180, 100, 50)];

    

    UIBezierPath * path3 = [UIBezierPath bezierPathWithArcCenter:CGPointMake(150, 150) radius:100 startAngle:0 endAngle:2*M_PI clockwise:YES];

    

    

    

    //3.把路径添加到图形上下文对象中

    

    CGContextAddPath(ctx, path1.CGPath);

    CGContextAddPath(ctx, path2.CGPath);

    CGContextAddPath(ctx, path3.CGPath);

    

    

    

    //3.1或一条线段

//    CGContextMoveToPoint(ctx, 50, 100);

//    

//    CGContextAddLineToPoint(ctx, 100, 200);

    

    CGContextSetLineWidth(ctx, 20);

    

    [[UIColor redColor] set];

    

    //4.渲染

    

    CGContextDrawPath(ctx, kCGPathStroke);

    

    

    //--------再画一个矩形--------

    

    //在下一次绘图之前替换掉当前的图形上下文状态

    CGContextRestoreGState(ctx);

    

    UIBezierPath * path4 = [UIBezierPath bezierPathWithRect:CGRectMake(50, 250, 50, 30)];

    CGContextAddPath(ctx, path4.CGPath);

    

        [[UIColor greenColor] set];

        CGContextSetLineWidth(ctx, 10);

    

    CGContextDrawPath(ctx, kCGPathStroke);

    //--------再画一个矩形--------


====================================================================


你可能感兴趣的:(基本图形绘制Quartz2d的的使用)