Dessiner / Peindre comme une couleur d'esquisse à l'intérieur d'un tracé de Bézier dans UIView

Je dessine une couche de forme à l'aide d'un path UIBezier sur un UIView:

CAShapeLayer *pathLayer = [CAShapeLayer layer]; pathLayer.frame=CGRectMake(-view.frame.origin.x, -view.frame.origin.y, view.frame.size.width, view.frame.size.height); pathLayer.path = path.CGPath; pathLayer.strokeColor = [[UIColor blackColor] CGColor]; pathLayer.fillColor = [[UIColor clearColor] CGColor]; //pathLayer.fillColor = nil; pathLayer.lineWidth = 6.0; pathLayer.lineJoin = kCALineJoinBevel; [view.layer addSublayer:pathLayer]; 

Sur les points de contact, je veux peindre sur cette UIView, pour ce que je fais:

 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch=[touches anyObject]; CGPoint touchBeganPoint; touchBeganPoint=[touch locationInView:self]; actionSsortingng=@"drawPencil"; previousPoint1 = [touch locationInView:self]; previousPoint2 = [touch locationInView:self]; currentPoint = [touch locationInView:self]; [self touchesMoved:touches withEvent:event]; } -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; previousPoint2 = previousPoint1; previousPoint1 = currentPoint; currentPoint = [touch locationInView:self]; [self calculateMinImageArea:previousPoint1 :previousPoint2 :currentPoint]; } CGPoint midPoint(CGPoint p1, CGPoint p2) //helper function { return CGPointMake((p1.x + p2.x) * 0.5, (p1.y + p2.y) * 0.5); } - (void)calculateMinImageArea:(CGPoint)pp1 :(CGPoint)pp2 :(CGPoint)cp { // calculate mid point CGPoint mid1 = midPoint(pp1, pp2); CGPoint mid2 = midPoint(cp, pp1); CGMutablePathRef path = CGPathCreateMutable(); CGPathMoveToPoint(path, NULL, mid1.x, mid1.y); CGPathAddQuadCurveToPoint(path, NULL, pp1.x, pp1.y, mid2.x, mid2.y); CGRect bounds = CGPathGetBoundingBox(path); CGPathRelease(path); CGRect drawBox = bounds; //Pad our values so the bounding box respects our line width drawBox.origin.x -= 20 * 1.5; drawBox.origin.y -= 20 * 1.5; drawBox.size.width += 20 * 2.5; drawBox.size.height += 20 * 2.5; UIGraphicsBeginImageContextWithOptions(drawBox.size, NO, 0); [self.layer renderInContext:UIGraphicsGetCurrentContext()]; curImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); // generate the if conditionover here and than check and draw over paths [self setNeedsDisplayInRect:drawBox]; [[NSRunLoop currentRunLoop] runMode:NSRunLoopCommonModes beforeDate: [NSDate date]]; } -(void)drawRect:(CGRect)rect { CGPoint mid1 = midPoint(previousPoint1, previousPoint2); CGPoint mid2 = midPoint(currentPoint, previousPoint1); [curImage drawAtPoint:CGPointMake(0, 0)]; CGContextRef context = UIGraphicsGetCurrentContext(); CALayer *layer=[self.layer.sublayers objectAtIndex:0]; [self.layer renderInContext:context]; CGContextMoveToPoint(context, mid1.x, mid1.y); CGContextAddQuadCurveToPoint(context, previousPoint1.x, previousPoint1.y, mid2.x, mid2.y); CGContextSetLineCap(context, kCGLineCapRound); CGContextSetBlendMode(context, kCGBlendModeNormal); CGContextSetLineJoin(context, kCGLineJoinRound); CGContextSetLineWidth(context, 20); CGContextSetStrokeColorWithColor(context,[UIColor redColor].CGColor); CGContextSetShouldAntialias(context, YES); CGContextSetAllowsAntialiasing(context, YES); CGContextSetFlatness(context, 1.f); CGContextSetAlpha(context,1.0); CGContextStrokePath(context); [super drawRect:rect]; } 

Maintenant, alors que je dessine sur self.layer, il est encore en train d'effectuer la sous-couche ajoutée (couche de forme) .Je veux dessiner seulement à l'intérieur de ce path, je ne peux pas aller avec [path containpoint ..], le dessin a une certaine largeur et il traverse le path ou perturbe parfois son coup.

Une façon d'y parvenir est de découper l'UIView avec sa sous-couche (CAShapelayer) et donc de le dessiner à nouveau sur uiview (cela effacera l'arrière-plan en dehors de la zone de calque de forme). Mais ne trouvez pas comment le découper avec CAShapeLayer.

Toute suggestion ou idée sur la façon d'y parvenir en douceur pourrait être d'une grande aide. Je vous remercie !

A pris une autre image qui est l'instantané de la vue avec le path souhaité, rempli avec la couleur sélectionnée. Que sur les touches déplacées appelées drawrect avec le même code avec une petite exception de [UIColor colorWithPatternImage: img] comme couleur de context. Le dessin dans UIView sur les points de contact donne un effet de dessin flou sur les limites