使用清晰剪切的方式创建一个模糊视图

4
我正在创建一个带有中间透明矩形的模糊视图叠加层。到目前为止,我的代码实现了相反的效果,即在中间有一个模糊剪裁而成的透明视图。

我已经从以下帖子中调整了我的步骤,如果有人能指点我正确的方向,我将不胜感激。

Swift mask of circle layer over UIView

CALayer with transparent hole in it

let blurView = UIVisualEffectView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height))
blurView.effect = UIBlurEffect(style: UIBlurEffectStyle.dark)

let scanLayer = CAShapeLayer()
scanLayer.path = CGPath(rect: scanRect, transform: nil)

view.addSubview(blurView)
blurView.layer.addSublayer(scanLayer)
blurView.layer.mask = scanLayer

我不知道...但是最后一行代码不应该存在:blurView.layer.mask = scanLayer。 - Naresh
请参考 Dănuț Mihai Florian 的回答,了解如何使用 Swift 创建一个裁剪形状的视图。 - Naresh
1个回答

10
你可以像这样做:

(你可以按照以下方式进行操作)

    let scanLayer = CAShapeLayer()

    let scanRect = CGRect.init(x: 100, y: 100, width: 200, height: 100)

    let outerPath = UIBezierPath(rect: scanRect)

    let superlayerPath = UIBezierPath.init(rect: blurView.frame)
    outerPath.usesEvenOddFillRule = true
    outerPath.append(superlayerPath)
    scanLayer.path = outerPath.cgPath
    scanLayer.fillRule = kCAFillRuleEvenOdd
    scanLayer.fillColor = UIColor.black.cgColor

    view.addSubview(blurView)
    blurView.layer.mask = scanLayer

这个解决方案可行!但是我不理解这个概念。为什么需要有superlayerPath? - Koh
因为您需要遮盖内部矩形周围的所有内容,但不包括矩形本身。您可以添加以下代码以查看蒙版的工作原理:let superlayerPath = UIBezierPath.init(ovalIn: blurView.frame) - Vitaly Migunov
谢谢您的出色回答。现在我想在那个剪切区域上添加阴影。这可能吗?请帮帮我。@VitalyMigunov - Yogendra Patel
1
这是一个新问题的话题@YogendraPatel - Vitaly Migunov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接