美文网首页
iOS开发:Quartz2D绘图

iOS开发:Quartz2D绘图

作者: 鹏飞九天324 | 来源:发表于2017-10-12 15:38 被阅读16次

    首先,要了解图形上下文CGContextRef,图形上下文可以理解为一块画布,我们要在画布上进行绘画,然后UIView相当于画的支架,画布要贴在支架上展示。
    所以,既然CGContextRef是画布,那么我们就要有一块画布,我们获取画布就是在UIView的drawRect方法里。

    首先创建一个继承UIView的子类,.m文件里drawRect方法系统注释掉了。
    将其解除注释,然后就可以在drawRect方法里进行绘图!
    

    1、绘制直线

        //1、获取图形上下文
        CGContextRef ctx = UIGraphicsGetCurrentContext();
        //2、先起点、连线到下一点...
        CGContextMoveToPoint(ctx, 50, 10);
        CGContextAddLineToPoint(ctx, 50, 70);
        CGContextAddLineToPoint(ctx, 70, 100);
        //设置线宽
        CGContextSetLineWidth(ctx, 5);
        //设置起点和终点的样式
        CGContextSetLineCap(ctx, kCGLineCapRound);
        //设置转折点的样式
        CGContextSetLineJoin(ctx, kCGLineJoinRound);
        //设置线条颜色方法一
        CGContextSetRGBStrokeColor(ctx, 1.0, 0, 0, 1);
        //设置线条颜色方法二
        [[UIColor redColor] setStroke];
        //3、绘制
        CGContextStrokePath(ctx);
    

    2、绘制三角形

        //1、获取图形上下文
        CGContextRef ctx0 = UIGraphicsGetCurrentContext();
        //2、连上三个点
        CGContextMoveToPoint(ctx0, 10, 150);
        CGContextAddLineToPoint(ctx0, 50, 200);
        CGContextAddLineToPoint(ctx0, 25, 250);
        //3、首尾相连
        CGContextClosePath(ctx0);
        //4、绘制
        CGContextStrokePath(ctx0);
    

    3、绘制矩形

        //1、获取图形上下文
        CGContextRef ctx1 = UIGraphicsGetCurrentContext();
        //2、设置矩形位置
        CGContextAddRect(ctx1, CGRectMake(200, 300, 100, 150));
        //3、设置填充颜色
        [[UIColor redColor] setFill];
        //4、绘制
        CGContextFillPath(ctx1);
    

    4、绘制圆形

        //1、获取图形上下文
        CGContextRef ctx2 = UIGraphicsGetCurrentContext();
        //2、设置圆形位置(宽高不一样则为椭圆)
        CGContextAddEllipseInRect(ctx2, CGRectMake(200, 50, 100, 100));
        //3、绘制
        CGContextFillPath(ctx2);
    

    5、绘制弧线

        //1、获取图形上下文
        CGContextRef ctx3 = UIGraphicsGetCurrentContext();
        //2、设置弧线位置(上下文, 圆心x, 圆心y, 半径, 开始角度, 结束角度, 0代表顺时针1代表逆时针)
        CGContextAddArc(ctx3, 300, 200, 50, M_PI, M_PI_2, 1);
        //3、绘制
        CGContextStrokePath(ctx3);
    

    6、绘制虚线

        //画虚线(还有用CAShapeLayer也可以画虚线)
        //1、获取图形上下文
        CGContextRef ctx4 = UIGraphicsGetCurrentContext();
        //设置颜色
        CGContextSetStrokeColorWithColor(ctx4, [UIColor redColor].CGColor);
        //设置线宽
        CGContextSetLineWidth(ctx4, 2.0);
        /* 2、设置虚线参数
        c 绘制的context,这个不用多说;
        phase,第一个虚线段从哪里开始,例如传入3,则从第三个单位开始;
        lengths,一个C数组,表示绘制部分和空白部分的分配。例如传入[2,2],则绘制2个单位,然后空白两个单位,以此重复;
        count lengths的数量;
         */
        CGFloat lengths[] = {5};
        CGContextSetLineDash(ctx4, 0, lengths, 1);
        //设置线段位置
        CGContextMoveToPoint(ctx4,150,150);
        CGContextAddLineToPoint(ctx4, 150, 300);
        //3、绘制
        CGContextStrokePath(ctx4);
    

    7、绘制曲线

        //画曲线
        //1、获取图形上下文
        CGContextRef ctx5 = UIGraphicsGetCurrentContext();
        //2、创建路径对象
        UIBezierPath *path = [UIBezierPath bezierPath];
        //3、设置起点位置
        [path moveToPoint:CGPointMake(50, 280)];
        //4、添加一根曲线到某点(三次曲线用addCurveToPoint,二次曲线用addQuadCurveToPoint)
        [path addQuadCurveToPoint:CGPointMake(250, 280) controlPoint:CGPointMake(100, 100)];
        //5、将绘制的内容添加到上下文中
        CGContextAddPath(ctx5, path.CGPath);
        //6、渲染
        CGContextStrokePath(ctx5);
    

    8、Translate(移动)、Rotate(旋转)、Scale(缩放)

        //移动
        //1、获取图形上下文
        CGContextRef ctx = UIGraphicsGetCurrentContext();
        //2、设置需要移动到的新坐标点(必须要在原图设置前)
        CGContextTranslateCTM(ctx, 10, 10);
        //3、设置原图坐标位置
        CGContextAddRect(ctx, CGRectMake(0, 0, 100, 100));
        //4、渲染
        CGContextFillPath(ctx);
    
        //旋转
        //1、获取图形上下文
        CGContextRef ctx = UIGraphicsGetCurrentContext();
        //2、设置需要旋转的角度(必须要在原图设置前)
        CGContextRotateCTM(ctx, M_PI_4);
        //3、设置原图坐标位置
        CGContextAddRect(ctx, CGRectMake(100, 0, 40, 5));
        //4、渲染
        CGContextFillPath(ctx);
    
        //缩放
        //1、获取图形上下文
        CGContextRef ctx = UIGraphicsGetCurrentContext();
        //2、设置缩放比例(缩放体现(100,100,100,100)---->(50,10,50,10))
        CGContextScaleCTM(ctx, 0.5, 0.1);
        //3、设置原图坐标位置
        CGContextAddRect(ctx, CGRectMake(100, 100, 100, 100));
        //4、渲染
        CGContextFillPath(ctx);
    

    9、Shadow(阴影)和Gradient(渐变)

    阴影

        //阴影
        //1、获取图形上下文
        CGContextRef ctx = UIGraphicsGetCurrentContext();
        //2、添加一个矩形
        CGContextAddRect(ctx, CGRectMake(100, 100, 100, 100));
        //3、设置阴影方位(ctx,(x向偏移量,y向偏移量), blur 非负数,决定阴影的模糊程度,数越大越模糊)
        CGContextSetShadow(ctx, CGSizeMake(-10.0, 10.0), 1.0);
        //4、渲染
        CGContextFillPath(ctx);
    

    渐变

    渐变就是从一种颜色逐渐变换为另一种颜色:
    Quart提供了两种渐变模型
    1、axial gradient:线性渐变,使用的时候设置好两个顶点的颜色(也可以设置中间过渡色)
    2、radial gradient :可以实现一个圆到另一个圆的渐变或者一个点到另一个点的渐变

    两种渐变的绘制模型:
    CGShading - 使用这种数据类型需要自己定义CFFunction来计算每一个点的渐变颜色,较为复杂,但是能够更灵活的绘制。
    CGGradient- 使用这种数据类型只需要制定两个顶点的颜色,以及绘制模式,其余的Quartz会给绘制,但是渐变的数学模型不灵活。

        CGContextRef context = UIGraphicsGetCurrentContext();
        //用CGGradient绘制
        CGColorSpaceRef deviceRGB = CGColorSpaceCreateDeviceRGB();
        size_t num_of_locations = 2;
        CGFloat locations[2] = {0.0,1.0};
        CGFloat components[8] = {1.0, 0.0, 0.0, 1.0,  // 红色
            0.0, 1.0, 0.0, 1.0};//绿色
        CGGradientRef gradient = CGGradientCreateWithColorComponents(deviceRGB, components, locations,num_of_locations);
        CGPoint startPoint = CGPointMake(0, 50);
        CGPoint endPoint = CGPointMake(0, 100);
        CGContextDrawLinearGradient(context,gradient,startPoint, endPoint,0);
        CGColorSpaceRelease(deviceRGB);
        CGGradientRelease(gradient);
    

    10、复杂绘图(状态堆栈)

        //多图绘制(状态堆栈)
        //1、绘制第一图
        CGContextRef ctx = UIGraphicsGetCurrentContext();
        //2、保存状态,入栈
        CGContextSaveGState(ctx);
        CGContextAddRect(ctx, CGRectMake(10, 10, 50, 50));
        CGContextSetLineWidth(ctx, 5.0);
        CGContextFillPath(ctx);
        //3、推出栈(此时坐标系已经回到了最开始的状态)
        CGContextRestoreGState(ctx);
        //4、可以绘制第二图
        CGContextAddEllipseInRect(ctx, CGRectMake(100, 100, 100, 100));
        CGContextSetFillColorWithColor(ctx, [UIColor purpleColor].CGColor);
        CGContextFillPath(ctx);

    相关文章

      网友评论

          本文标题:iOS开发:Quartz2D绘图

          本文链接:https://www.haomeiwen.com/subject/acxoyxtx.html