Quartz 2D绘图

(1) 绘图Context是一个绘图的目标对象,定义了绘图的基本属性,如颜色、绘图范围、线宽及样式等。
 
   (2)通过UIView会创建Context,可以用类似如下的语句来得到当前的Context.
 
   CGContextRef currentContext = UIGraphicsGetCurrentContext();
 
   (3)如果在对其进行修改前想要保存当前状态,可以使用UIGraphicsPushContext;
 
         要恢复保存过的Context,则可用UIGraphicsPopContext。
 
   (4)path,路径其实就是用一系列坐标点标识出来的一条曲线或折线,创建好之后就可以沿其画线,或者对封闭的空间进行填充。
//重写初始化方法,在视图初始化的时候创建并设置自定义的Context
-(instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        self.backgroundColor = [UIColor whiteColor];
        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();//指定色彩空间为RGB
        whiteBoardContext = CGBitmapContextCreate(NULL, self.frame.size.width, self.frame.size.height, 8, 4 * self.frame.size.width, colorSpace, kCGImageAlphaPremultipliedFirst);
    }
   return self;
}
 
//
//  WhiteBoardView.m
//  draw2
//
//  Created by K-Net on 15-5-7.
//  Copyright (c) 2015年 K-Net. All rights reserved.
//

#import "WhiteBoardView.h"
//#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
//#define kCGImageAlphaPremultipliedLast (kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedLast)
//#else
//#define kCGImageAlphaPremultipliedLast  kCGImageAlphaPremultipliedLast
//#endif

@implementation WhiteBoardView
//重写初始化方法,在视图初始化的时候创建并设置自定义的Context
-(instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        self.backgroundColor = [UIColor whiteColor];
        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();//指定色彩空间为RGB
        whiteBoardContext = CGBitmapContextCreate(NULL, self.frame.size.width, self.frame.size.height, 8, 4 * self.frame.size.width, colorSpace, (CGBitmapInfo)kCGImageAlphaPremultipliedFirst);
//        kCGBitmapAlphaInfoMask = 0x1F,
//        kCGBitmapFloatComponents = (1 << 8),
//        (CGBitmapInfo)kCGImageAlphaPremultipliedFirst
//        kCGBitmapByteOrderMask = 0x7000,
//        kCGBitmapByteOrderDefault = (0 << 12),
//        kCGBitmapByteOrder16Little = (1 << 12),
//        kCGBitmapByteOrder32Little = (2 << 12),
//        kCGBitmapByteOrder16Big = (3 << 12),
//        kCGBitmapByteOrder32Big = (4 << 12)
       
        CGColorSpaceRelease(colorSpace);
        //创建新的CGLayer,用于画图
        whiteBoardLayer =CGLayerCreateWithContext(whiteBoardContext, self.frame.size, NULL);
        //获得新建层的context
        CGContextRef layerContext = CGLayerGetContext(whiteBoardLayer);
        //指定新建层Context的线宽
        CGContextSetLineWidth(layerContext, 1.5);
        //指定线头形状为圆形
//        enum CGLineCap {
//            kCGLineCapButt,
//            kCGLineCapRound,
//            kCGLineCapSquare
//        };
        CGContextSetLineCap(layerContext, kCGLineCapRound);
        //指定线的颜色,黑色
        CGContextSetRGBStrokeColor(layerContext, 0.0, 0.7, 0.0, 1);
    }
    return self;
}
//重写drawRect方法
-(void)drawRect:(CGRect)rect {
    //先得到当前的Context
    CGContextRef currentContext = UIGraphicsGetCurrentContext();
    //根据Context的内容生成Bitmap
    CGImageRef image = CGBitmapContextCreateImage(currentContext);
    //把bitmap绘制到Context上
    CGContextDrawImage(currentContext, [self bounds], image);
    //把whiteBoardLayer也绘到当前Context上
    CGContextDrawLayerInRect(currentContext, [self bounds], whiteBoardLayer);
}

//屏幕触摸事件  触摸开始

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    //得到touch对象
    UITouch *theTouch = [touches anyObject];
    if ([theTouch tapCount] == 2) {//如果是双击,就清空图像
        //CGContextClearRect清楚指定矩形区域上绘制的图形
        CGContextClearRect(whiteBoardContext, [self bounds]);//清空
        [self setNeedsDisplay];//刷新屏幕显示
    } else {
        [self touchesMoved:touches withEvent:event];
    }
}
//手指移动触发事件
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *theTouch = [touches anyObject];//获取任意手指触摸
    //获取当前的位置
    CGPoint currentTouchLocation = [theTouch locationInView:self];
    //得到上次的位置
    CGPoint lastTouchLocation = [theTouch previousLocationInView:self];
    //取得Context
    CGContextRef layerContext = CGLayerGetContext(whiteBoardLayer);
    //开始定义path
    CGContextBeginPath(layerContext);
    //把path的起点移动到上次位置
    CGContextMoveToPoint(layerContext, lastTouchLocation.x, lastTouchLocation.y);
    //在上次位置和当前位置之间连线,并计入path
    CGContextAddLineToPoint(layerContext, currentTouchLocation.x, currentTouchLocation.y);
    //沿path画线
    CGContextStrokePath(layerContext);
    [self setNeedsDisplay];//刷新屏幕显示
    NSLog(@"-================");
}
@end
 
 
 
 
原文地址:https://www.cnblogs.com/tian-sun/p/4485014.html