demo功能:三種顏色畫筆和橡皮擦的畫圖板demo 【iphone 6.1 測試通過】
demo說明:項目中PaintView.m 是demo的畫板部分,PaintView和三個顏色按鈕添加到ViewController的view中。構成程序主界面。
demo截屏:
demo主要代碼:PaintView.m 畫板view部分
#import "PaintView.h" #import <QuartzCore/QuartzCore.h> @implementation PaintView @synthesize paintColor = _paintColor; @synthesize erase; - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.layer.shadowColor = [UIColor blackColor].CGColor; self.layer.shadowOpacity = 0.8; self.layer.shadowOffset = CGSizeMake(5, 5); self.backgroundColor = [UIColor whiteColor]; self.paintColor = [UIColor blackColor]; // Initialization code linesArray = [[NSMutableArray alloc]init]; UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panGesture:)]; [self addGestureRecognizer:panGesture]; [panGesture release]; } return self; } - (void)dealloc { [linesArray release]; [_paintColor release]; [super dealloc]; } // 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(); CGContextSetLineWidth(context, 20); //NSLog(@"color:%@",_paintColor); for (NSDictionary *lineDic in linesArray) { UIColor *lineColor = [lineDic objectForKey:@"color"]; CGContextSetStrokeColorWithColor(context, lineColor.CGColor); CGMutablePathRef paintPath = CGPathCreateMutable(); NSArray *linePointArray = [lineDic objectForKey:@"line"]; for (NSInteger i=0; i<linePointArray.count; i++) { CGPoint point = [[linePointArray objectAtIndex:i]CGPointValue]; if (i==0) { //CGContextMoveToPoint(context, point.x, point.y); CGPathMoveToPoint(paintPath, NULL, point.x, point.y); }else { //CGContextAddLineToPoint(context, point.x, point.y); CGPathAddLineToPoint(paintPath, NULL, point.x, point.y); } } CGContextAddPath(context, paintPath); CGContextStrokePath(context); if ([lineDic objectForKey:@"eraseArray"]) { //NSLog(@"color:%@",lineColor); NSMutableArray *eraseArray = [lineDic objectForKey:@"eraseArray"]; CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor); CGMutablePathRef paintPath = CGPathCreateMutable(); for (NSInteger i=0; i<eraseArray.count; i++) { CGPoint point = [[eraseArray objectAtIndex:i]CGPointValue]; //NSLog(@"erase point:%@",NSStringFromCGPoint(point)); if (i==0) { //CGContextMoveToPoint(context, point.x, point.y); CGPathMoveToPoint(paintPath, NULL, point.x, point.y); }else { //CGContextAddLineToPoint(context, point.x, point.y); CGPathAddLineToPoint(paintPath, NULL, point.x, point.y); } } CGContextAddPath(context, paintPath); CGContextStrokePath(context); } } } -(void)panGesture:(UIPanGestureRecognizer*)thePan{ CGPoint touchPoint = [thePan locationInView:self]; if (self.erase) { if (thePan.state==UIGestureRecognizerStateChanged) { for (NSMutableDictionary *lineDic in linesArray) { NSMutableArray *linePointArray = [lineDic objectForKey:@"line"]; for (NSInteger i=0; i<linePointArray.count; i++) { CGPoint point = [[linePointArray objectAtIndex:i]CGPointValue]; CGFloat distance = powf(point.x-touchPoint.x,point.y-touchPoint.y); if (distance<20) { NSMutableArray *eraseArray; if ([lineDic objectForKey:@"eraseArray"]) { eraseArray = [lineDic objectForKey:@"eraseArray"]; }else { eraseArray = [NSMutableArray array]; } [eraseArray addObject:[NSValue valueWithCGPoint:touchPoint]]; [lineDic setObject:eraseArray forKey:@"eraseArray"]; CGRect paintRect = CGRectMake(touchPoint.x-50, touchPoint.y-50, 100, 100); [self setNeedsDisplayInRect:paintRect]; //[self setNeedsDisplay]; continue; } } } } //[self eraseLine:currentLineDic erase:[thePan locationInView:self]]; }else { if (thePan.state==UIGestureRecognizerStateBegan) { NSMutableArray *currentLineArray = [NSMutableArray arrayWithObject:[NSValue valueWithCGPoint:touchPoint]]; NSMutableDictionary *lineDic = [NSMutableDictionary dictionaryWithObjectsAndKeys:currentLineArray,@"line",_paintColor,@"color", nil]; [linesArray addObject:lineDic]; }else if(thePan.state==UIGestureRecognizerStateChanged){ NSMutableDictionary *lineDic = [linesArray lastObject]; NSMutableArray *currentLineArray = [lineDic objectForKey:@"line"]; [currentLineArray addObject:[NSValue valueWithCGPoint:touchPoint]]; CGRect paintRect = CGRectMake(touchPoint.x-50, touchPoint.y-50, 100, 100); [self setNeedsDisplayInRect:paintRect]; }else if(thePan.state==UIGestureRecognizerStateEnded){ } } } @end