假设我有一些UIView,而且我在该视图中也有一个“封闭的”UIBezierPath。我想要实现的是让这条路径“外”的所有东西都是白色的,里面是透明的(就像那个路径形状的洞)。像this这样的解决方案不起作用,出于某种原因,内部形状的一部分也是白色的。
答案 0 :(得分:0)
您可以使用view.layer.mask
属性在视图中打洞。
我正在使用这段代码从图片制作蒙版,但您也可以将UIBezierPath
绘制到CALayer
并使用它代替。
/*
Get a layer that can be used to mask an image. All pixels with alpha 0 in mask image will be hidden
use as:
self.view.layer.mask = <Mask returned from this call>
self.view.layer.masksToBounds = YES;
*/
+(CALayer*)getMaskLayerFromImage:(UIImage*)image
{
CALayer *mask = [CALayer layer];
mask.contents =(id) image.CGImage;
mask.frame = CGRectMake(0, 0, image.size.width, image.size.height);
return mask;
}
答案 1 :(得分:0)
我通过使用UIBezierPath和CAShapeLayer实现了这一点
我从故事板中获取视角。
@IBOutlet weak var myView: UIView!
创建UIBezierPath()的对象
var path = UIBezierPath()
创建一个以视图为中心的方法,我们创建另一个UIBezierPath()为 circlePath ,这是一个圆圈,我们将圆圈附加到之前的UIBezierPath()路径。<登记/> 知道拿一个CAShapeLayer并剪切 circlePath
更改中心点以在特定点上绘制圆圈。
func overLay() {
let sizes = CGSize(width: 30, height: 30)
let circlePath = UIBezierPath(ovalIn: CGRect(origin: self.view.center, size: sizes))
path.append(circlePath)
let maskLayer = CAShapeLayer() //create the mask layer
maskLayer.path = path.cgPath // Give the mask layer the path you just draw
maskLayer.fillRule = kCAFillRuleEvenOdd // Cut out the intersection part
myView.layer.mask = maskLayer
}