swift - 添加一个 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)
但我明白了我怎样才能让 rect 保持绑定?
解决方案
这有点像在黑暗中拍摄。但最有可能的问题是您的视图改变了位置,而添加掩码的代码没有。
假设您当前有以下代码:
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()
}
}
这里的关键是每次视图更改位置时重新创建蒙版。在重新创建掩码之前,需要保留和移除掩码。然后只需在更改视图大小的方法中调用应用掩码。
推荐阅读
- javascript - 在 typescript 文件中导入 package.json:'require' 调用可能会转换为导入
- java - 确定可以包含平面坐标系上所有点的具有给定半径的最小圆量
- java - 以非 root 用户身份运行需要 root 的脚本?
- linux - 是否可以对只读文件系统进行权限更改?
- typescript - 暗模式功能之前的事件监听器
- java - 摆动标签在 BoxLayout 中无法正确对齐
- excel - 创建 Excel 层次结构
- sql-server - SSIS包的优化
- android - 错误:./node_modules/tslib/tslib.es6.js 模块构建失败。无法读取未定义的属性“类型”
- dart - 为什么使用 bool 时流分析不起作用?