Ios 如何从CALayer中的图像中减去形状?

Ios 如何从CALayer中的图像中减去形状?,ios,Ios,我正在构建一个自定义视图,其中包括一个图像和一个徽章。这张图显示了我想要的结果 我可以很容易地用草图实现这一点,但编程要困难得多 我在CALayer和UIBezierPath中找不到减法运算,所以我不知道如何创建剪裁形状来遮罩图像 我想要什么 我现在有什么 类PetAvatarView:UIView{ var图像:UIImage{ 迪塞特{ layer.contents=图像?.cgImage } } 私人出租maskLayer=CAShapeLayer() 重写初始化(帧:CGRect){

我正在构建一个自定义视图,其中包括一个图像和一个徽章。这张图显示了我想要的结果

我可以很容易地用草图实现这一点,但编程要困难得多

我在CALayer和UIBezierPath中找不到减法运算,所以我不知道如何创建剪裁形状来遮罩图像

我想要什么

我现在有什么

类PetAvatarView:UIView{ var图像:UIImage{ 迪塞特{ layer.contents=图像?.cgImage } } 私人出租maskLayer=CAShapeLayer() 重写初始化(帧:CGRect){ super.init(frame:frame) layer.mask=maskLayer } 必需的初始化?(编码器aDecoder:NSCoder){ fatalError(“初始化(编码者:)尚未实现”) } 覆盖func布局子视图(){ super.layoutSubviews() maskLayer.frame=layer.bounds //形象 设imageMaskRadius=bounds.width/2 设imageMaskCenter=CGPoint(x:imageMaskRadius,y:imageMaskRadius) 让imageMaskPath=UIBezierPath() imageMaskPath.addArc(中心:imageMaskCenter,半径:imageMaskRadius,startAngle:0,终点:CGFloat.pi*2,顺时针:true) 设badgeMaskRadius=bounds.width/5 设badgeMaskCenter=CGPoint(x:bounds.maxX-badgeMaskRadius,y:bounds.maxY-badgeMaskRadius) 让badgeMaskPath=UIBezierPath() badgeMaskPath.addArc(中心:badgeMaskCenter,半径:badgeMaskRadius,星形缠结:0,端角:CGFloat.pi*2,顺时针:true) let path=imageMaskPath append(badgeMaskPath.reversing()) path.usesevenodfillrule=true maskLayer.path=path.cgPath } 因此,我不知道如何创建剪裁形状来遮罩图像

是的,你自己说的。你创建了一个带有剪辑的形状,并用它来遮罩图像。你的代码的问题是你实际上没有做任何剪辑

下面是一个没有徽章的示例,演示如何从图像上的圆形遮罩中取出圆形“咬合”:

这是怎么做到的?好吧,我从显示小猫图像的图像视图开始。然后我给了该图像视图一个面具。面具看起来像这样(如果你能看到面具):

现在唯一的问题是如何绘制遮罩。显然,我们是通过填充大圆来完成的。但在此之前,我们创建了一个由小圆(右下方)加上整个遮罩的边界框组成的剪切路径。因此大圆最终被剪切到该区域中

请注意,徽章绘图本身,红色圆圈,现在不能是图像视图的子视图或子层,因为我们刚刚屏蔽了该区域!但是,这不是一个困难的问题;故事中只需要有另一个视图


可爱的小猫!谢谢你的回答,我终于意识到了这一点。