#import "ViewController.h" #import "DrawView.h" @interface ViewController () @end
@implementation ViewController -(void)loadView{ self.view = [[DrawView alloc]init]; self.view.backgroundColor = [UIColor whiteColor]; } - (void)viewDidLoad { [super viewDidLoad]; } @end //////////////////////////////////////////////////////////// #import "DrawView.h" @interface DrawView() @end @implementation DrawView - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { _lineArray = [NSMutableArray array]; UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; btn.frame = CGRectMake(100, 420, 100, 40); btn.backgroundColor=[UIColor yellowColor]; [btn setTitle:@"撤销" forState:UIControlStateNormal]; [btn addTarget:self action:@selector(undoDraw) forControlEvents:UIControlEventTouchUpInside]; [self addSubview:btn]; } return self; } //撤销操作 -(void)undoDraw{ [_lineArray removeLastObject];//删除最后一条线 [self setNeedsDisplay];//让View重绘,自动重绘 } //每次手指开始触摸,增加一个新的数组,数组记录划过的点,利用这些点绘画 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ [_lineArray addObject:[NSMutableArray arrayWithCapacity:1]]; } -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ UITouch *touche = [touches anyObject]; CGPoint point = [touche locationInView:self]; //数组里需要id类型 NSValue *value = [NSValue valueWithCGPoint:point]; //把value装到_lineArray的最后一个元素(数组)里 [[_lineArray lastObject] addObject:value]; [self setNeedsDisplay];//重绘界面 } -(void)drawRect:(CGRect)rect{ CGContextRef context = UIGraphicsGetCurrentContext();//获得上下文 CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);//画笔颜色 for (int i=0; i<[_lineArray count]; i++) { NSMutableArray *pointArray = [[NSMutableArray alloc]initWithArray:[_lineArray objectAtIndex:i]]; for (int j=0; j<[pointArray count]-1; j++) { //遍历所有的点 NSValue *a = [pointArray objectAtIndex:j]; CGPoint p1 = [a CGPointValue]; NSValue *b = [pointArray objectAtIndex:j+1]; CGPoint p2 = [b CGPointValue]; CGContextMoveToPoint(context, p1.x, p1.y); CGContextAddLineToPoint(context, p2.x, p2.y); } } //在当前的图形上下文中,根据画笔的颜色和画笔的路径,进行绘制 CGContextStrokePath(context); } @end