如何创build一个UIView(在Swift中)的透明圆?

我想创build一个如下所示的视图: 目标视图

我想我需要的是具有某种面具的uview,我可以使用UIBezierpath制作一个圆形的面具,但是我不能倒过来使得它掩盖了除了圆之外的所有东西。 我需要这是一个视图的蒙版,而不是一个填充图层,因为我打算屏蔽的视图上有一个UIBlurEffect。 最终目标是将这个UIView设置为超出我现有的视图来提供指导。

请注意,我正在使用swift。 有没有办法做到这一点? 如果是这样,怎么样?

你可以使用这个函数来创build你所需要的。

func createOverlay(frame : CGRect) { let overlayView = UIView(frame: frame) overlayView.alpha = 0.6 overlayView.backgroundColor = UIColor.blackColor() self.view.addSubview(overlayView) let maskLayer = CAShapeLayer() // Create a path with the rectangle in it. var path = CGPathCreateMutable() let radius : CGFloat = 50.0 let xOffset : CGFloat = 10 let yOffset : CGFloat = 10 CGPathAddArc(path, nil, overlayView.frame.width - radius/2 - xOffset, yOffset, radius, 0.0, 2 * 3.14, false) CGPathAddRect(path, nil, CGRectMake(0, 0, overlayView.frame.width, overlayView.frame.height)) maskLayer.backgroundColor = UIColor.blackColor().CGColor maskLayer.path = path; maskLayer.fillRule = kCAFillRuleEvenOdd // Release the path since it's not covered by ARC. overlayView.layer.mask = maskLayer overlayView.clipsToBounds = true } 

调整radiusxOffsetyOffset以更改圆的半径和位置。

对于Swift 3,这里是rakeshbs的答案格式,所以它返回所需的UIView:

 func createOverlay(frame : CGRect, xOffset: CGFloat, yOffset: CGFloat, radius: CGFloat) -> UIView { let overlayView = UIView(frame: frame) overlayView.alpha = 0.6 overlayView.backgroundColor = UIColor.black // Create a path with the rectangle in it. let path = CGMutablePath() path.addArc(center: CGPoint(x: xOffset, y: yOffset), radius: radius, startAngle: 0.0, endAngle: 2 * 3.14, clockwise: false) path.addRect(CGRect(x: 0, y: 0, width: overlayView.frame.width, height: overlayView.frame.height)) let maskLayer = CAShapeLayer() maskLayer.backgroundColor = UIColor.black.cgColor maskLayer.path = path; maskLayer.fillRule = kCAFillRuleEvenOdd // Release the path since it's not covered by ARC. overlayView.layer.mask = maskLayer overlayView.clipsToBounds = true return overlayView } 

Swift 4再次更新,并删除了一些项目,使代码更紧密。

 func createOverlay(frame : CGRect, xOffset: CGFloat, yOffset: CGFloat, radius: CGFloat) -> UIView { let overlayView = UIView(frame: frame) overlayView.backgroundColor = UIColor.black.withAlphaComponent(0.6) let path = CGMutablePath() path.addArc(center: CGPoint(x: xOffset, y: yOffset), radius: radius, startAngle: 0.0, endAngle: 2.0 * CGFloat.pi, clockwise: false) path.addRect(CGRect(origin: .zero, size: overlayView.frame.size)) let maskLayer = CAShapeLayer() maskLayer.backgroundColor = UIColor.black.cgColor maskLayer.path = path maskLayer.fillRule = kCAFillRuleEvenOdd overlayView.layer.mask = maskLayer overlayView.clipsToBounds = true return overlayView } 

发生了什么事情的粗略分解:

  1. 创build一个大小为指定框架的视图,黑色背景设置为不透明度为60%
  2. 使用提供的起点和半径创build绘制圆的path
  3. 创build要删除的区域的掩码
  4. 将蒙版和剪辑应用于边界

下面的代码片段将会调用它,并在半径为50的屏幕中间放置一个圆:

 let overlay = createOverlay(frame: view.frame, xOffset: view.frame.midX, yOffset: view.frame.midY, radius: 50.0) view.addSubview(overlay) 

看起来像这样: 在这里输入图像说明