Your code is close, but you need a custom layer class that has a gray background and draws the path as transparent. You can do it with code like this
RevealLayer.h
@interface RevealLayer : CALayer @property (strong, nonatomic) UIBezierPath *drawingPath; @end
RevealLayer.m
@implementation RevealLayer - (UIBezierPath *)drawingPath { if ( !_drawingPath ) { _drawingPath = [UIBezierPath new]; [_drawingPath moveToPoint:CGPointZero]; [_drawingPath setLineWidth:20.0]; [_drawingPath setLineCapStyle:kCGLineCapRound]; } return( _drawingPath ); } - (void)drawInContext:(CGContextRef)context { UIGraphicsPushContext( context ); [[UIColor darkGrayColor] set]; CGContextFillRect( context, self.bounds ); CGContextSetBlendMode( context, kCGBlendModeClear ); [self.drawingPath stroke]; UIGraphicsPopContext(); } @end
Then the code for the custom view class is similar to what you already have. However, the setup is slightly different, and you do not need to implement the drawRect: method.
CustomView.m
@interface CustomView() @property (strong, nonatomic) RevealLayer *revealLayer; @end @implementation CustomView - (void)setup { self.userInteractionEnabled = YES; [self setMultipleTouchEnabled:NO]; self.image = [UIImage imageNamed:@"transformers.jpg"]; self.revealLayer = [RevealLayer new]; self.revealLayer.frame = self.bounds; self.revealLayer.backgroundColor = [[UIColor clearColor] CGColor]; [self.revealLayer setNeedsDisplay]; [self.layer addSublayer:self.revealLayer]; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; CGPoint location = [touch locationInView:self]; [self.revealLayer.drawingPath moveToPoint:location]; [self.revealLayer setNeedsDisplay]; } - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; CGPoint location = [touch locationInView:self]; [self.revealLayer.drawingPath addLineToPoint:location]; [self.revealLayer setNeedsDisplay]; }
user3386109 Jun 02 '14 at 17:19 2014-06-02 17:19
source share