TouchView.h

#import 
@interface TouchView : UIView{ NSMutableArray * _lineArray;}//初始化线条颜色@property (nonatomic,retain)UIColor * pointColor;@end

TouchView.m

#import "TouchView.h"#define REDTAG 10#define YELLOWTAG 11#define ORANGETAG 12   #define GREENTAG 13#define PURPLETAG 14@implementation TouchView- (void)dealloc {    [_lineArray release];    _lineArray = Nil;    [_pointColor release];    _pointColor = Nil;    [super dealloc];}- (id)initWithFrame:(CGRect)frame{    self = [super initWithFrame:frame];    if (self) {        // Initialization code                  _lineArray = [[NSMutableArray alloc]init];                  //初始化颜色为黑色       _pointColor = [UIColor blackColor];         //删除按钮    UIButton * del = [[UIButton alloc]initWithFrame:CGRectMake(0, 330, 250, 20)];    [del setBackgroundColor:[UIColor brownColor]];    [del setTitle:@"撤销" forState:UIControlStateNormal];    [del addTarget:self action:@selector(delAction) forControlEvents:UIControlEventTouchUpInside];    [self addSubview:del];    [del release];          //颜色按钮    UIButton * redButton = [[UIButton alloc]initWithFrame:CGRectMake(0, 350, 50, 50)];    [redButton setBackgroundColor:[UIColor redColor]];        redButton.tag = REDTAG;        [redButton addTarget:self action:@selector(colorAction:) forControlEvents:UIControlEventTouchUpInside];    [self addSubview:redButton];    [redButton release];                UIButton * yellowButton = [[UIButton alloc]initWithFrame:CGRectMake(50, 350, 50, 50)];    [yellowButton setBackgroundColor:[UIColor yellowColor]];        yellowButton.tag = YELLOWTAG;        [yellowButton addTarget:self action:@selector(colorAction:)forControlEvents:UIControlEventTouchUpInside];    [self addSubview:yellowButton];    [yellowButton release];                UIButton * orangeButton = [[UIButton alloc]initWithFrame:CGRectMake(100, 350, 50, 50)];    [orangeButton setBackgroundColor:[UIColor orangeColor]];        orangeButton.tag = ORANGETAG;        [orangeButton addTarget:self action:@selector(colorAction:) forControlEvents:UIControlEventTouchUpInside];    [self addSubview:orangeButton];    [orangeButton release];          UIButton * greenButton = [[UIButton alloc]initWithFrame:CGRectMake(150, 350, 50, 50)];    [greenButton setBackgroundColor:[UIColor greenColor]];        greenButton.tag = GREENTAG;        [greenButton addTarget:self action:@selector(colorAction:) forControlEvents:UIControlEventTouchUpInside];    [self addSubview:greenButton];    [greenButton release];                 UIButton * purpleButton = [[UIButton alloc]initWithFrame:CGRectMake(200, 350, 50, 50)];    [purpleButton setBackgroundColor:[UIColor purpleColor]];        purpleButton.tag = PURPLETAG;        [purpleButton addTarget:self action:@selector(colorAction:) forControlEvents:UIControlEventTouchUpInside];    [self addSubview:purpleButton];    [purpleButton release];          }          return self;}//按钮点击事件- (void)colorAction:(id)sender{    UIButton * button = (UIButton *)sender;    switch (button.tag) {        case REDTAG:        {            _pointColor = [UIColor redColor];        }            break;                          case YELLOWTAG:        {            _pointColor = [UIColor yellowColor];        }            break;                          case ORANGETAG:        {            _pointColor = [UIColor orangeColor];        }            break;                          case GREENTAG:        {            _pointColor = [UIColor greenColor];        }            break;                          case PURPLETAG:        {            _pointColor = [UIColor purpleColor];        }            break;                      default:            break;    }}//4个方法进入.h中点UIView,点UIResponder进入找- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{          UITouch * touch = [touches anyObject];//获取触摸动作          CGPoint point = [touch locationInView:self];//获得初始坐标    NSValue * value = [NSValue valueWithCGPoint:point];//结构体转换成对象;也能用于把对象转换成结构体,这是固定格式;                NSMutableArray * points = [NSMutableArray array];//局部变量 遍历构造器不用释放    [points addObject:value];//                NSMutableDictionary * dic = [NSMutableDictionary dictionary];    [dic setObject:points forKey:@"points"];                [dic setObject:_pointColor forKey:@"color"];                [_lineArray addObject:dic];//将字典放到数组线中      }- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{    UITouch * touch = [touches anyObject];    CGPoint ponit = [touch locationInView:self];    NSValue * value = [NSValue valueWithCGPoint:ponit];            //    NSMutableArray * points = [_lineArray lastObject];//取出线数组里最后一个元素//   //    [points addObject:value];//把移动坐标放到线数组里                      NSMutableDictionary * dic = [_lineArray lastObject];//    NSMutableArray * points = [dic objectForKey:@"points"];//从大字典里取出数组    [points addObject:value];//往小数组里添加所有点                [self setNeedsDisplay];//调用下面画图方法;系统不允许用drawRect,用setNeedsDisplay手动调用}- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{      }- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{      }//删除事件- (void)delAction{    [_lineArray removeLastObject];//移除最后一划    [self setNeedsDisplay];}// Only override drawRect: if you perform custom drawing.// An empty implementation adversely affects performance during animation.- (void)drawRect:(CGRect)rect{    // Drawing code                CGContextRef context = UIGraphicsGetCurrentContext();                for (NSDictionary * lineDic in _lineArray) {                            NSArray * line = [lineDic objectForKey:@"points"];                            NSValue * firstValue = [line firstObject];//得到起始点        CGPoint firstPoint = [firstValue CGPointValue];//转换为Point类型;正常数据转换                  UIColor * color = [lineDic objectForKey:@"color"];        CGContextSetStrokeColorWithColor(context, color.CGColor);                  CGContextMoveToPoint(context, firstPoint.x, firstPoint.y);//起始点                            for (NSValue * value in [lineDic objectForKey:@"points"]) {            CGPoint currentPonit = [value CGPointValue];            CGContextAddLineToPoint(context, currentPonit.x, currentPonit.y);        }                  CGContextStrokePath(context);       }}@end