首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建一个内部带有透明圆圈的UIView (在快速模式下)?

问如何创建一个内部带有透明圆圈的UIView (在快速模式下)?
EN

Stack Overflow用户
提问于 2015-02-11 15:24:46
回答 4查看 24.5K关注 0票数 32

我想创建一个如下所示的视图:

​

我想我需要的是一个带有某种遮罩的uiview,我可以用UIBezierpath制作一个圆形的遮罩,但是我不能反转这个遮罩,这样它就可以遮盖除了圆之外的所有东西。我需要这是一个视图的蒙版,而不是一个填充层,因为我打算遮罩的视图上有一个UIBlurEffect。最终的目标是在我现有的视图之上创建这个UIView的动画,以提供指导。

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

EN

回答 4

Stack Overflow用户

发布于 2017-11-27 13:38:57

为Swift 4再次更新&删除了一些项目以使代码更紧凑。

请注意, maskLayer.fillRule 在Swift 4和Swift 4.2中的设置有所不同。

代码语言:javascript
复制
func createOverlay(frame: CGRect,
                   xOffset: CGFloat,
                   yOffset: CGFloat,
                   radius: CGFloat) -> UIView {
    // Step 1
    let overlayView = UIView(frame: frame)
    overlayView.backgroundColor = UIColor.black.withAlphaComponent(0.6)
    // Step 2
    let path = CGMutablePath()
    path.addArc(center: CGPoint(x: xOffset, y: yOffset),
                radius: radius,
                startAngle: 0.0,
                endAngle: 2.0 * .pi,
                clockwise: false)
    path.addRect(CGRect(origin: .zero, size: overlayView.frame.size))
    // Step 3
    let maskLayer = CAShapeLayer()
    maskLayer.backgroundColor = UIColor.black.cgColor
    maskLayer.path = path
    // For Swift 4.0
    maskLayer.fillRule = kCAFillRuleEvenOdd
    // For Swift 4.2
    maskLayer.fillRule = .evenOdd
    // Step 4
    overlayView.layer.mask = maskLayer
    overlayView.clipsToBounds = true

    return overlayView
}

对正在发生的事情进行粗略的分析:

  1. 创建大小为指定帧的视图,黑色背景设置为60%不透明度
  2. 使用提供的起点创建绘制圆的路径,并为要删除的区域应用遮罩
  3. 将遮罩& clip应用于边界

下面的代码片段将调用此方法,并在屏幕中央放置一个半径为50的圆:

代码语言:javascript
复制
let overlay = createOverlay(frame: view.frame,
                            xOffset: view.frame.midX,
                            yOffset: view.frame.midY,
                            radius: 50.0)
view.addSubview(overlay)

它看起来像这样:

​

票数 54
EN

Stack Overflow用户

发布于 2015-02-11 16:35:16

您可以使用此函数来创建所需的内容。

代码语言:javascript
复制
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
}

调整radius、xOffset和yOffset以更改圆的半径和位置。

票数 42
EN

Stack Overflow用户

发布于 2016-11-02 20:13:17

对于Swift 3,下面是rakeshbs的答案,格式化后返回所需的UIView:

代码语言:javascript
复制
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
}
票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28448698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档