如何使用蒙版裁剪视图,但裁剪部分部分不透明而不是隐藏?

How to crop view with mask, but leave cropped-out parts partially opaque instead of hidden?

我想裁剪视图的一部分。我关注了这篇文章:"How to mask one UIView using another UIView",这是我目前的代码:

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        /// show a green border around the image view's original frame
        let backgroundView = UIView(frame: CGRect(x: 50, y: 50, width: 200, height: 300))
        backgroundView.layer.borderColor = UIColor.green.cgColor
        backgroundView.layer.borderWidth = 4
        view.addSubview(backgroundView)
        
        let imageView = UIImageView(frame: CGRect(x: 50, y: 50, width: 200, height: 300))
        imageView.image = UIImage(named: "TestImage")
        imageView.contentMode = .scaleAspectFill
        imageView.clipsToBounds = true
        view.addSubview(imageView)
        
        // MARK: - Mask code
        let maskView = UIView(frame: CGRect(x: 80, y: 100, width: 100, height: 100))
        maskView.backgroundColor = .blue /// ensure opaque
        view.addSubview(maskView)
        
        imageView.mask = maskView
        
    }
}

面具工作正常:

Without mask With mask

但是,我希望图像视图中被裁剪掉的部分仍然存在,但只是具有较低的 alpha。它应该是这样的:

我试过将 maskView.alpha 更改为 0.25,但这只会使带有遮罩的部分不那么不透明。

如何让裁剪掉的部分仍然存在,只是更透明一点?

最好我不想制作另一个视图,因为最终我会在相机预览层上使用它——额外的视图可能会降低性能。


编辑:

我尝试添加一个背景颜色较少 alpha 的子视图:

let maskView = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 300))
maskView.backgroundColor = UIColor.blue.withAlphaComponent(0.3)

let maskView2 = UIView(frame: CGRect(x: 80, y: 100, width: 100, height: 100))
maskView2.backgroundColor = UIColor.blue.withAlphaComponent(1)
maskView2.alpha = 0

maskView.addSubview(maskView2)

imageView.mask = maskView

但这是结果:

一切都取决于您绘制遮罩的颜色的透明度。 (色调——我们通常认为的颜色——无关紧要。)掩蔽取决于透明度。部分透明的蒙版区域将使蒙版视图部分透明。

所以将蒙版设置为目标视图的整个大小,并使整个蒙版成为部分透明的颜色,除了中心区域是不透明的颜色。