Recorte personalizado de una image utilizando la ruta Bézier

Hola iam tratando de hacer una herramienta de cultivo personalizada que permite al usuario crear una región cerrada personalizada utilizando la ruta bezier.

introduzca la descripción de la imagen aquí

El código que estoy usando para recortar imageView con la ruta es

CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init]; maskLayer.frame = self.bounds; maskLayer.path = clippingPath.CGPath; [imgView.layer setMask:maskLayer]; 

pero el resultado es

introduzca la descripción de la imagen aquí

¿Puede alguien señalarme en la dirección correcta, lo que necesito hacer?

 -(void)longPressAddPoint:(UITapGestureRecognizer*)gesture { ctr++; CGPoint touchpoint=[gesture locationInView:self]; [ptsNew addObject:[NSValue valueWithCGPoint:[gesture locationInView:self] ]]; if(ctr>1) { if(CGRectContainsPoint([self viewWithTag:1].frame, [gesture locationInView:self])) { pathClosed=YES; touchpoint=[self viewWithTag:1].center; } UIView *greenCircle=[[UIView alloc]initWithFrame:CGRectMake(0, 0, 20, 20)]; greenCircle.center=touchpoint; greenCircle.backgroundColor=[UIColor greenColor]; [greenCircle setTag:ctr]; [greenCircle.layer setCornerRadius:10]; [self addSubview:greenCircle]; [pathMain appendPath:[pathCurrent bezierPathByReversingPath]]; pathMain.usesEvenOddFillRule=YES; [pathCurrent moveToPoint:[[ptsNew objectAtIndex:ptsNew.count-2] CGPointValue]]; [pathCurrent addCurveToPoint:[[ptsNew objectAtIndex:ptsNew.count-1] CGPointValue] controlPoint1:firstControllPoint.center controlPoint2:[[ptsNew objectAtIndex:ptsNew.count-1] CGPointValue]]; // this is how a Bezier curve is appended to a path [self setNeedsDisplay]; } else { UIView *greenCircle=[[UIView alloc]initWithFrame:CGRectMake(0, 0, 20, 20)]; greenCircle.center=touchpoint; greenCircle.backgroundColor=[UIColor greenColor]; [greenCircle setTag:ctr]; [greenCircle.layer setCornerRadius:10]; [self addSubview:greenCircle]; } } - (void)drawRect:(CGRect)rect { [pathCurrent stroke]; [pathMain stroke]; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; if(CGRectContainsPoint(firstControllPoint.frame,[touch locationInView:self] )&&(ptsNew.count>=2)) { flagForTouch=YES; } else { flagForTouch=NO; } } - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; CGPoint p = [touch locationInView:self]; if (flagForTouch) // 4th point { [pathCurrent removeAllPoints]; [self setNeedsDisplay]; [pathCurrent moveToPoint:[[ptsNew objectAtIndex:ptsNew.count-2] CGPointValue]]; [pathCurrent addCurveToPoint:[[ptsNew objectAtIndex:ptsNew.count-1] CGPointValue] controlPoint1:firstControllPoint.center controlPoint2:[[ptsNew objectAtIndex:ptsNew.count-1] CGPointValue]]; // this is how a Bezier curve is appended to a path [self setNeedsDisplay]; } if(flagForTouch) firstControllPoint.center=[[touches anyObject] locationInView:self]; } - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { } - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { [self touchesEnded:touches withEvent:event]; } #pragma mark:- clipping image based on path - (void) setClippingPath:(UIBezierPath *)clippingPath imageViewObj: (UIImageView *)imgView; { // if (![[imgView layer] mask]) // [[imgView layer] setMask:[CAShapeLayer layer]]; // // [(CAShapeLayer*) [[imgView layer] mask] setPath:[clippingPath CGPath]]; CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init]; maskLayer.frame = self.bounds; clippingPath.usesEvenOddFillRule=YES; maskLayer.path = clippingPath.CGPath; [imgView.layer setMask:maskLayer]; UIGraphicsBeginImageContext(self.frame.size); } -(void)getCroppedImage:(sendImageBlock)Image { sendImageToBase=Image; } -(void)cropIt { if (pathClosed) { NSLog(@"path closed crop now"); [pathMain appendPath:[pathCurrent bezierPathByReversingPath]]; pathMain.usesEvenOddFillRule=YES; [self setClippingPath:[pathMain bezierPathByReversingPath] imageViewObj:self.imageToBeCropped]; sendImageToBase(self.imageToBeCropped); } } 

Tengo una ruta principal (que se pasa como ruta de recorte). Creo la ruta actual a la que el usuario puede agregar la curva. Cuando el usuario agrega una ruta nueva, la ruta actual se agrega a la ruta principal.