Eraser for UIBezierPath

孤街浪徒 提交于 2019-12-24 00:53:23

问题


I am using UIBezierPath for free hand drawing in an iPad app. I want to apply an eraser to a uibezierpath.

However, I want to only erase the drawing in its path. I cannot use the path color as the background color because I have other elements on the background.

Below is how I am creating my free hand drawings:

- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];

    if (self) {
        self.backgroundColor = [UIColor clearColor];
        self.opaque = NO;
        lineWidths = 10;
        brushPattern = [UIColor greenColor]; 
        pathArray = [[NSMutableArray alloc]init];
        bufferArray = [[NSMutableArray alloc]init];
        self.multipleTouchEnabled = NO;
    }

    return self;
}

- (void)drawRect:(CGRect)rect {
    for (NSMutableDictionary *dictionary in pathArray) {
        UIBezierPath *_path = [dictionary objectForKey:@"Path"];
        UIColor *_colors = [dictionary objectForKey:@"Colors"];
        [_colors setStroke];
        _path.lineCapStyle = kCGLineCapRound;
        [_path stroke];
    }
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    myPath = [[UIBezierPath alloc]init];
    myPath.lineWidth = lineWidths;
    CGPoint touchPoint = [[touches anyObject] locationInView:self];

    UITouch *mytouch = [[touches allObjects] objectAtIndex:0];
    [myPath moveToPoint:[mytouch locationInView:self]];
    [myPath addLineToPoint:CGPointMake(touchPoint.x, touchPoint.y)];

    dict = @{@"Path": myPath, @"Colors": brushPattern};
    [pathArray addObject:dict];

    [self setNeedsDisplay];

    [undoManager registerUndoWithTarget:self selector:@selector(undoButtonClicked) object:nil];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *mytouch = [[touches allObjects] objectAtIndex:0];
    [myPath addLineToPoint:[mytouch locationInView:self]];
    [self setNeedsDisplay];
}

回答1:


Store a BOOL value for erase: BOOL _erase;

BOOL eraseButtonIsTapped = ...
if eraseButtonIsTapped {
    _erase = yes;
} else{
    _erase = NO;
}

When drawing:

[myPath strokeWithBlendMode:_erase?kCGBlendModeClear:kCGBlendModeNormal alpha:1.0f];



回答2:


Just try this

    brushPattern = view.backgroundColor;

This will draw a new line with the color what exactly behind your drawn path. And you can use the same pathArray to do this. So that later on you can implement redo/undo operations too. if you want i could explain you more on this.



来源:https://stackoverflow.com/questions/11185763/eraser-for-uibezierpath

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!