iOS Quartz2D 绘制简单图形--线,圆,弧线,贝塞尔曲线,文字

本文代码参考:http://www.cnblogs.com/kenshincui/p/3959951.html

Quartz2D绘制2D图形
    
    在iOS中常用的绘图框架就是Quartz2D, Quartz2D是CoreGraphics框架的一部分, 强大的二维图像绘制引擎, Quartz2D在UIKit框架中也有很好的集成, UIKit中的组件都是由CoreGraphics进行绘制的,
    
    iOS中绘图一般分为以下几个步骤:
    1. 获取绘图上下文
    2. 创建并设置路径
    3. 将路径添加到上下文
    4. 设置上下文的状态
    5. 绘制路径
    6. 释放路径

这里需要注意的是:

1.Core Graphics是基于C语言的一套框架,开发时无法像使用Obj-C一样调用;

2.在Quartz 2D中凡是使用带有“Create”或者“Copy”关键字方法创建的对象,在使用后一定要

使用对应的方法释放(由于这个框架基于C语言编写无法自动释放内存);

3.Quartz 2D是跨平台的,因此其中的方法中不能使用UIKit中的对象(UIKit只有iOS可用),

例如用到的颜色只能用CGColorRef而不能用UIColor,但是UIKit中提供了对应的转换方法

4.在C语言中枚举一般以“k”开头,由于Quartz 2D基于C语言开发,所以它也不例外(参数中

很多枚举都是k开头的);

5.由于Quartz 2D是Core Graphics的一部分,所以API多数以CG开头;


6.在使用Quartz 2D绘图API中所有以“Ref”结尾对象,在声明时都不必声明为指针类型;


7.在使用Quartz 2D绘图API时,凡是“UI”开头的相关绘图函数,都是UIKit对Core Graphics的

封装(主要为了简化绘图操作);


   
    图形上下文CGContextRef代表图形输出设备(绘制的位置), 包含了绘制图形的一些设备信息, Quartz2D中的所有对象最终都会绘制到上下文上(上下文可以是位图Bitmap, PDF,  窗口Window, 层Layer, 打印对象Print)


绘制效果 :



直接上代码简单粗暴, 很好理解, 注释很全:


//
//  Quartz2DView.m
//  Quartz2DView
//
//  Created by 帝炎魔 on 16/5/25.
//  Copyright © 2016年 帝炎魔. All rights reserved.
//

#import "Quartz2DView.h"

@implementation Quartz2DView


/**
 *  Quartz2D绘制2D图形
    
    在iOS中常用的绘图框架就是Quartz2D, Quartz2D是CoreGraphics框架的一部分, 强大的二维图像绘制引擎, Quartz2D在UIKit框架中也有很好的集成, UIKit中的组件都是由CoreGraphics进行绘制的, 
    
    iOS中绘图一般分为以下几个步骤:
    1. 获取绘图上下文
    2. 创建并设置路径
    3. 将路径添加到上下文
    4. 设置上下文的状态
    5. 绘制路径
    6. 释放路径
    
    图形上下文CGContextRef代表图形输出设备(绘制的位置), 包含了绘制图形的一些设备信息, Quartz2D中的所有对象最终都会绘制到上下文上(上下文可以是位图Bitmap, PDF,  窗口Window, 层Layer, 打印对象Print)
 
 *
*/




// 绘图只能在此方法中调用, 否则无法得到当前图形上下文
- (void)drawRect:(CGRect)rect {
  
    // 1. 取得图形上下文对象
    CGContextRef context = UIGraphicsGetCurrentContext();
    
//     // 2. 创建路径对象
//    CGMutablePathRef path = CGPathCreateMutable();
//    
//    CGPathMoveToPoint(path, nil, 20, 50); // 设置路径的起始点
//    CGPathAddLineToPoint(path, nil, 20, 100); // 从起始点开始绘制
//    CGPathAddLineToPoint(path, nil, 300, 100); // 绘制另一条直线, 从上一个直线终点开始绘制
//    
//    // 3. 添加路径到上下文
//    CGContextAddPath(context, path);
//    
//    // 4, 设置图形上下文状态属性
//    CGContextSetRGBStrokeColor(context, .5, 0, 0, 1); // 设置描边颜色
//    CGContextSetRGBFillColor(context, 1.0, 0, 0, 1); // 设置填充颜色
//    CGContextSetLineWidth(context, 5.0); // 设置线条的宽度
//    CGContextSetLineCap(context, kCGLineCapRound); // 设置顶点的样式 (起始点和终点)
//    CGContextSetLineJoin(context, kCGLineJoinBevel); // 设置连接点的样式(中间点)
//    
//    /**
//     *  设置线段样式
//        phase : 虚线开始的位置
//        lengths : 虚线长度间隔 
//        count : 虚线数组元素的个数
//     */
//    CGFloat lengths[2] = {18, 9};
//    CGContextSetLineDash(context, 0, lengths, 2);
//    
//    /**
//     *   设置阴影
//        context : 图形上下文
//        offset : 阴影的偏移量
//        blur : 模糊度
//        color : 阴影的颜色
//     */
//    CGColorRef color = [UIColor brownColor].CGColor; // 将UIKit的Color转换下格式
//    CGContextSetShadowWithColor(context, CGSizeMake(10, -10), 0.7, color);
//    
//    // 5. 绘制图像到指定图形上下文
//    /**
//     *  CGPathDrawingMode是填充方式,枚举类型
//     kCGPathFill:只有填充(非零缠绕数填充),不绘制边框
//     kCGPathEOFill:奇偶规则填充(多条路径交叉时,奇数交叉填充,偶交叉不填充)
//     kCGPathStroke:只有边框
//     kCGPathFillStroke:既有边框又有填充
//     kCGPathEOFillStroke:奇偶填充并绘制边框
//     */
//    CGContextDrawPath(context, kCGPathFillStroke); // 最后一个参数是填充的类型
//    
//    
//    // 释放对象
//    CGPathRelease(path);
//    CGColorRelease(color);
//    CGContextRelease(context);
    
    
#pragma mark --- 简化的绘图方式
    
    // 直线
    [self drawLineWithContext:context];
    
    // 矩形
    [self drawRectWithContext:context];
    
    // 利用UIKit封装的方法绘制矩形
    [self drawRectByUIKitWithContext:context];
    
    // 绘制椭圆
    [self drawEllipse:context];
    
    
    // 绘制弧形
    [self drawArcWithContext:context];
    
    
    // 绘制贝塞尔曲线
  //  [self drawCurve:context];
    
    // 图像绘制
   // [self drawImage:context];


       
    // 绘制文字
   // [self drawTextWithContext:context];
 }

#pragma mark --- 绘制直线
- (void)drawLineWithContext:(CGContextRef)context
{
    // 1. 绘制路径
    CGContextMoveToPoint(context, 20, 50);
    CGContextAddLineToPoint(context, 20, 100);
    CGContextAddLineToPoint(context, 300, 100);
    
    // 2. 封闭路径
    CGContextClosePath(context);
    
    // 3. 设置图形上下文
    [[UIColor redColor] setStroke]; // 设置描边颜色
    [[UIColor greenColor] setFill ]; // 设置填充颜色
   // [[UIColor redColor] set] // 同时设置描边和填充颜色
    
    // 4. 绘制路径
    CGContextDrawPath(context, kCGPathFillStroke);
}


#pragma mark ---- 绘制矩形
- (void)drawRectWithContext:(CGContextRef)context
{
    // 1. 添加矩形的对象
    CGContextAddRect(context, CGRectMake(100, 120, 200, 20));
    
    // 2. 设置属性
    [[UIColor redColor] set];
    
    // 3. 绘制
    CGContextDrawPath(context, kCGPathFillStroke);
}

#pragma mark --- 绘制矩形----> 利用UIKit的封装方法
- (void)drawRectByUIKitWithContext:(CGContextRef)context
{
    [[UIColor brownColor] set];
    
    UIRectFill(CGRectMake(100, 150, 200, 20));
    
    [[UIColor redColor] setStroke];
    UIRectFrame(CGRectMake(100, 200, 200, 20));
    
}

#pragma mark --- 绘制椭圆 
- (void)drawEllipse:(CGContextRef)context
{
    // 添加对象, 绘制椭圆 , 先创建一个矩形
    CGContextAddEllipseInRect(context, CGRectMake(100, 240, 200, 100));
    
    // 设置属性
    [[UIColor redColor] setStroke];
    [[UIColor greenColor] setFill];
    // 设置描边的宽度
    CGContextSetLineWidth(context, 5);
    CGContextDrawPath(context, kCGPathFillStroke);
}

#pragma mark --- 绘制弧形
- (void)drawArcWithContext:(CGContextRef)context
{
    /**
     *  添加弧形对象
        x : 中心点的 x坐标
        y : 中心点的 y坐标
        radius : 半径
        startAngle : 起始弧度
        endAngle : 终止弧度
        closeWise : 是否逆时针绘制, 0则顺时针绘制, 1 逆时针绘制
     */
    CGContextAddArc(context, 200, 450, 50, 0, M_PI * 3 / 2 , 0);
    
    // 设置属性
    [[UIColor blueColor] set];
    
    // 绘制图形
    CGContextDrawPath(context, kCGPathFillStroke);
}

#pragma mark ---- 绘制贝塞尔曲线
/**
 *  利用路径可以绘制直线, 同时利用路径也可以绘制不规则曲线, 都属于路径绘制   
    
    Quartz2D绘制曲线分为两种, 一个是二次贝塞尔曲线, 还有一个是三次贝塞尔曲线
 
    贝塞尔曲线需要起始点, 终止点 和控制点
 
    二次贝塞尔曲线只有一个控制点, 
    CGContextAddQuadCurveToPoint(CGContextRef c, CGFloat cpx, CGFloat x, CGFloat y);
 
    三次贝塞尔曲线是有两个控制点
    CGContextAddCurveToPoint(context, CGFloat)
 */
- (void)drawCurve:(CGContextRef)context
{
   // 绘制曲线 设置移动的起始点
    CGContextMoveToPoint(context, 20, 100);
    
    /**
     *  绘制二次贝塞尔曲线
        第一个参数 : 控制点的位置
        第二个参数 : 终止点的位置
     */
    
    CGContextAddQuadCurveToPoint(context, 200, 40, 300, 100);
    
    
    
    // 设置贝塞尔曲线的起始点
    CGContextMoveToPoint(context, 20, 300);
    
    /**
     *  绘制三次贝塞尔曲线
        第一个参数 : 第一个控制点的坐标位置
        第二个参数 : 第二个控制点的坐标位置
        第三个参数 : 终止点的坐标
     */
    
    CGContextAddCurveToPoint(context, 100, 200, 200, 500, 300, 300);
    
    // 设置颜色
    [[UIColor redColor] setFill];
    [[UIColor greenColor] setStroke];
    // 绘制路径
    CGContextDrawPath(context, kCGPathFillStroke);
    
    
}

#pragma mark --- 将图像绘制到图形上下文
- (void)drawImage:(CGContextRef)context
{
    
    // 使用UIKit中封装的方法进行图像绘制 坐标原点为左上角
    UIImage *image = [UIImage imageNamed:@"shaonv"];
    // 绘制到指定Rect矩形中
    [image drawInRect:self.bounds];
    
    // 以一个起始点绘制图片
  // [ image drawAtPoint:<#(CGPoint)#>];
    // 以平铺式 绘制图片
    // [image drawAsPatternInRect:self.bounds];
    
    
}

#pragma mark ---- 绘制文字
- (void)drawTextWithContext:(CGContextRef)context
{
    // 绘制到指定区域的内容
    NSString *string = @"Star Walk is the most beautiful stargazing app you’ve ever seen on a mobile device. It will become your go-to interactive astro guide to the night sky, following your every movement in real-time and allowing you to explore over 200, 000 celestial bodies with extensive information about stars and constellations that you find";
    CGRect rect = CGRectMake(20, 50, 280, 300);
    UIFont *font = [UIFont systemFontOfSize:18]; // 设置字体
    UIColor *color = [UIColor redColor]; // 设置字体颜色
    // 设置段落样式
    NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
    NSTextAlignment align = NSTextAlignmentLeft; // 对齐方式
    style.alignment = align;
    [string drawInRect:rect withAttributes:@{NSFontAttributeName:font, NSForegroundColorAttributeName:color, NSParagraphStyleAttributeName : style}];
}

@end


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值