在ios中用于图像裁剪的圆形遮罩

我试图给图像视图一个圆形蒙版,我必须在圆形区域裁剪图像部分,这是正常的。 但我面临着面具的一些问题,在附图中注明了这个问题。 屏蔽图像以进行裁剪功能

以下是我用来掩饰的代码片段。

将遮罩添加到图像视图层

CAShapeLayer *maskLayer = [CAShapeLayer layer]; self.imageView.layer.mask = maskLayer; self.maskLayer = maskLayer; 

为圆形创建形状图层我们将在图像顶部绘制(圆的边界)

 CAShapeLayer *circleLayer = [CAShapeLayer layer]; circleLayer.lineWidth = 3.0; circleLayer.fillColor = [[UIColor clearColor] CGColor]; circleLayer.strokeColor = [[UIColor blackColor] CGColor]; [self.imageView.layer addSublayer:circleLayer]; self.circleLayer = circleLayer; 

创建圆路径

 [self updateCirclePathAtLocation:CGPointMake(self.view.bounds.size.width / 2.0, self.view.bounds.size.height / 2.0) radius:self.view.bounds.size.width * 0.30]; - (void)updateCirclePathAtLocation:(CGPoint)location radius:(CGFloat)radius { self.circleCenter = location; self.circleRadius = radius; UIBezierPath *path = [UIBezierPath bezierPath]; [path addArcWithCenter:self.circleCenter radius:self.circleRadius startAngle:0.0 endAngle:M_PI * 2.0 clockwise:YES]; /* [[UIColor colorWithWhite:0 alpha:0.1] setFill]; [path fill]; */ self.maskLayer.path = [path CGPath]; self.circleLayer.path = [path CGPath]; } 

任何人都可以建议使圆形蒙版周围的白色区域部分可见或使用alpha应用透明CGColor?

我的方式是:

我在UIImageView顶部放置了一个UIView ,我在顶部UIView上做了一个透明孔,这样就可以通过该视图看到底部图像。

这是UIView的drawRect

 - (void)drawRect:(CGRect)rect { [super drawRect:rect]; CGContextRef context = UIGraphicsGetCurrentContext(); // Clear any existing drawing on this view // Remove this if the hole never changes on redraws of the UIView CGContextClearRect(context, self.bounds); // Create a path around the entire view UIBezierPath *clipPath = [UIBezierPath bezierPathWithRect:self.bounds]; // Your transparent window. This is for reference, but set this either as a property of the class or some other way CGRect transparentFrame; //this is the frame of the hole // Add the transparent window UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:transparentFrame cornerRadius:5.0f]; [clipPath appendPath:path]; // NOTE: If you want to add more holes, simply create another UIBezierPath and call [clipPath appendPath:anotherPath]; // This sets the algorithm used to determine what gets filled and what doesn't clipPath.usesEvenOddFillRule = YES; // Add the clipping to the graphics context [clipPath addClip]; // set your color UIColor *tintColor = [UIColor greenColor]; // (optional) set transparency alpha CGContextSetAlpha(context, 0.7f); // tell the color to be a fill color [tintColor setFill]; // fill the path [clipPath fill]; } 

这里我使用了bezierWithROundedRect,您可以使用bezierWIthArc来获取圆形贝塞尔曲线。

你会得到这样的东西:

在此处输入图像描述

您可以调整topView的alpha值以获得所需的透明度。 通过这种方式,您还可以通过触摸移动孔,并根据您的触摸位置重新绘制视图。