ios 三种颜色画笔和橡皮擦的画图板demo

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

 

 

demo下载地址:http://download.csdn.net/detail/donny_zhang/5572237


posted @ 2013-06-13 20:17  爱生活,爱编程  阅读(1258)  评论(0编辑  收藏  举报