首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >掩膜层UIVisualEffectView

掩膜层UIVisualEffectView
EN

Stack Overflow用户
提问于 2016-09-20 13:10:22
回答 2查看 7.4K关注 0票数 17

我试图模糊一个MKMapView,同时也显示在它上面的圆圈面具。为了更好地形象化我的意思,您可以找到我当前状态的图像:

这几乎显示了我想要的东西,但是背景(地图)应该是模糊的,这在这张图片中不是这样的。我试着和UIVisualEffectView一起工作,但是我好像做错了什么。以下是我尝试过的:

代码语言:javascript
复制
func createOverlay(at: CGPoint) {
    var blur: UIView!
    blur = UIVisualEffectView (effect: UIBlurEffect (style: UIBlurEffectStyle.dark))

    blur.frame = self.mapView.frame
    blur.isUserInteractionEnabled = false
    self.mapView.addSubview(blur)

    let circleSize: CGFloat = 200

    let path = UIBezierPath (
        roundedRect: blur.frame,
        cornerRadius: 0)

    let circle = UIBezierPath (
        roundedRect: CGRect (origin: CGPoint(x:at.x - circleSize/2, y: at.y-circleSize/2),
                             size: CGSize (width: circleSize, height: circleSize)), cornerRadius: circleSize/2)

    path.append(circle)
    path.usesEvenOddFillRule = true

    let maskLayer = CAShapeLayer()
    maskLayer.path = path.cgPath
    maskLayer.fillRule = kCAFillRuleEvenOdd

    let borderLayer = CAShapeLayer()
    borderLayer.path = circle.cgPath
    borderLayer.strokeColor = UIColor.white.cgColor
    borderLayer.lineWidth = 10
    blur.layer.addSublayer(borderLayer)

    blur.layer.mask = maskLayer
}

总之,我的问题是:,我如何更改我的代码,以模糊地图视图,并显示上面的圆圈面具?

编辑刚刚发现,如果我删除添加圆圈掩码的代码,地图视图的模糊会工作.也许这是为了解决这个问题而引起的任何兴趣。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-20 15:18:49

经过一番探索,我现在找到了一个解决方案。我假设您使用的是Xcode 8,因为layer.mask有一个已知的bug,您不能在同一层同时使用模糊和掩码。

在操场上捣乱之后,我修复了这个问题,因此将尝试调整您的代码以匹配我的解决方案。如果您使用blurView的“掩码”属性,那么您应该没有问题。有一个错误报告给苹果,我相信是关于layer.mask不起作用的

这是最后的当前代码。

代码语言:javascript
复制
let maskLayer = CAShapeLayer()
maskLayer.path = path.cgPath
maskLayer.fillRule = kCAFillRuleEvenOdd

let borderLayer = CAShapeLayer()
borderLayer.path = circle.cgPath
borderLayer.strokeColor = UIColor.white.cgColor
borderLayer.lineWidth = 10
blur.layer.addSublayer(borderLayer)

blur.layer.mask = maskLayer

而不是这样,尝试使用以下方法:

代码语言:javascript
复制
let maskLayer = CAShapeLayer()
maskLayer.path = path.cgPath
maskLayer.fillRule = kCAFillRuleEvenOdd

let borderLayer = CAShapeLayer()
borderLayer.path = circle.cgPath
borderLayer.strokeColor = UIColor.white.cgColor
borderLayer.fillColor = UIColor.clear.cgColor //Remember this line, it caused me some issues
borderLayer.lineWidth = 10

let maskView = UIView(frame: self.view.frame)
maskView.backgroundColor = UIColor.black
maskView.layer.mask = maskLayer

blur.layer.addSublayer(borderLayer)
blur.mask = maskView

如果你有什么问题请告诉我!

票数 20
EN

Stack Overflow用户

发布于 2018-11-21 17:11:31

除了Jack的解决方案之外,如果您使用的是iOS >11,那么只需将blur.layer.mask设置为maskLayer:

代码语言:javascript
复制
if #available(iOS 11.0, *) {
    blur.layer.mask = maskLayer
} else {
    let maskView = UIView(frame: self.view.frame)
    maskView.backgroundColor = UIColor.black
    maskView.layer.mask = borderLayer
    blur.mask = maskView
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39595047

复制
相关文章

相似问题

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