在UIView中制作透明的“星形”洞

时间:2018-06-05 11:33:47

标签: ios

假设我有一些UIView,而且我在该视图中也有一个“封闭的”UIBezierPath。我想要实现的是让这条路径“外”的所有东西都是白色的,里面是透明的(就像那个路径形状的洞)。像this这样的解决方案不起作用,出于某种原因,内部形状的一部分也是白色的。

enter image description here

2 个答案:

答案 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
}

enter image description here