如何解决添加 CAShapeLayer 迅速越界
我正在尝试向我的 previewLayer 添加一个暗视图,除了我的 rectOfInterest,这是我的代码。 videoPreviewLayer 是我的 AVCaptureVideoPreviewLayer 和 qrCodeFrameView 是我的 rectOfInterest
let path = CGMutablePath()
qrCodeView.clipsToBounds = true
view.clipsToBounds = true
path.addRect(videoPreviewLayer!.bounds)
path.addRect(qrCodeFrameView.frame)
let maskLayer = CAShapeLayer()
maskLayer.path = path
maskLayer.fillColor = UIColor.black.withAlphaComponent(0.6).cgColor
maskLayer.fillRule = .evenOdd
videoPreviewLayer?.addSublayer(maskLayer)
但是我明白了如何才能使矩形保持约束?
解决方法
这有点像在黑暗中拍摄。但最有可能的问题是您的视图改变了位置,而添加掩码的代码没有。
假设您当前拥有以下代码:
func applyMask() {
let path = CGMutablePath()
qrCodeView.clipsToBounds = true
view.clipsToBounds = true
path.addRect(videoPreviewLayer!.bounds)
path.addRect(qrCodeFrameView.frame)
let maskLayer = CAShapeLayer()
maskLayer.path = path
maskLayer.fillColor = UIColor.black.withAlphaComponent(0.6).cgColor
maskLayer.fillRule = .evenOdd
videoPreviewLayer?.addSublayer(maskLayer)
}
func viewDidLoadOrSomeOtherInitKindOfMethod() {
applyMask()
}
然后你只需要升级到
let maskLayer: CAShapeLayer?
func applyMask() {
self.maskLayer?.removeFromSuperlayer()
let path = CGMutablePath()
qrCodeView.clipsToBounds = true
view.clipsToBounds = true
path.addRect(videoPreviewLayer!.bounds)
path.addRect(qrCodeFrameView.frame)
let maskLayer = CAShapeLayer()
maskLayer.path = path
maskLayer.fillColor = UIColor.black.withAlphaComponent(0.6).cgColor
maskLayer.fillRule = .evenOdd
videoPreviewLayer?.addSublayer(maskLayer)
self.maskLayer = maskLayer
}
// Relevant if doing this in view controller:
open override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
applyMask()
}
// Relevant if doing this in UIView using auto-layout
override func layoutSubviews() {
super.layoutSubviews()
applyMask()
}
// Relevant if doing this in UIView using manual setting of frame
override var frame: CGRect {
didSet {
applyMask()
}
}
这里的关键是在每次视图改变位置时重新创建掩码。在重新创建蒙版之前,需要保留和移除蒙版。然后只需在更改视图大小的方法中调用应用蒙版。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。