如何使用蒙版裁剪视图,但裁剪部分部分不透明而不是隐藏?
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
但这是结果:
一切都取决于您绘制遮罩的颜色的透明度。 (色调——我们通常认为的颜色——无关紧要。)掩蔽取决于透明度。部分透明的蒙版区域将使蒙版视图部分透明。
所以将蒙版设置为目标视图的整个大小,并使整个蒙版成为部分透明的颜色,除了中心区域是不透明的颜色。
我想裁剪视图的一部分。我关注了这篇文章:"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
但这是结果:
一切都取决于您绘制遮罩的颜色的透明度。 (色调——我们通常认为的颜色——无关紧要。)掩蔽取决于透明度。部分透明的蒙版区域将使蒙版视图部分透明。
所以将蒙版设置为目标视图的整个大小,并使整个蒙版成为部分透明的颜色,除了中心区域是不透明的颜色。