思路是将每一次按下屏幕的touch move时的点存到一个数组里,即一个数组相当于一个笔画;再将该代表笔画的数组保存到一个大数组中,每组每次touch的移动都历遍大数组和笔画数组,将点于点之间连接起来。
#import <UIKit/UIKit.h> @interface BIDDrawView : UIView {NSMutableArray *allPoints; }@end
#import "BIDDrawView.h"@implementation BIDDrawView- (id)initWithFrame:(CGRect)frame {self = [super initWithFrame:frame];if (self) {allPoints=[[NSMutableArray alloc] init];UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];btn.frame=CGRectMake(10, 30, 100, 30);[btn addTarget:self action:@selector(undo:) forControlEvents:UIControlEventTouchUpInside];[self addSubview:btn];}return self; }-(void)undo:(UIButton *)sender {if (allPoints.count>0) { // 如果撤销有问题需要把该判断移除[allPoints removeLastObject];[self setNeedsDisplay];} }- (void)drawRect:(CGRect)rect {if (allPoints.count == 0) {return;}CGContextRef ctx=UIGraphicsGetCurrentContext(); //获取画板,或者说获取画图上下文。CGContextSetStrokeColorWithColor(ctx, [UIColor redColor].CGColor); //设置画笔颜色。CGContextSetLineWidth(ctx, 1.5); //设置线条宽度。for (NSMutableArray *points in allPoints) {for (int i=0;i<points.count-1;i++) {if (points.count==0) {break;}NSValue *sValue = [points objectAtIndex:i];CGPoint sPoint=[sValue CGPointValue];NSValue *eValue = [points objectAtIndex:i+1];CGPoint ePoint=[eValue CGPointValue];CGContextMoveToPoint(ctx, sPoint.x, sPoint.y); //前往起点。CGContextAddLineToPoint(ctx, ePoint.x, ePoint.y); //由起点加线到终点。CGContextStrokePath(ctx);}} }-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {NSMutableArray *points = [NSMutableArray array];[allPoints addObject:points]; }-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {UITouch *touch = [touches anyObject];CGPoint p = [touch locationInView:self];NSValue *v = [NSValue valueWithCGPoint:p]; //CGPoint 转为 对象NSMutableArray *points = [allPoints lastObject];[points addObject:v];//驱动画笔(drawRect方法) [self setNeedsDisplay]; }
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {}
@end
效果: