今天會介紹 掃描的觸發回調、設定掃描範圍與加上遮罩
iOS 11 後新API,根視圖的邊距變更時會觸發該方法的回調
關於 CAShapeLayer & UIBezierPath:
UIBezierPath:屬於路徑
意味著我們使用UIBezierPath來繪出我們想要的形狀,但此時所繪出的圖案屬「圖案」,所以無法對其進行操作(像是動畫操作、移動、操縱或其他操作)
CAShapeLayer:屬於向量繪製圖層
因此可以被填充、觸碰,或是對他線條進行調整操作,並且人員可以在圖層上添加動畫特效,創造吸引人的動畫效果。
override func viewLayoutMarginsDidChange(){
scanQRCodeRectOfInterest() // 設定可掃描範圍的CGRect
scanQRCodeBlackView() // 設定遮罩
}
/// 設定可掃描範圍的CGRect
func scanQRCodeRectOfInterest(){
let width = superViewBounds.width / 2
let newX = superViewBounds.width / 2 - (width / 2)
let newY = superViewBounds.height / 2 - (width / 1.5)
let tempPath = UIBezierPath(roundedRect: CGRect(x: newX, y: newY, width: width, height: width), cornerRadius: width / 10)
scanQRcodePath = tempPath
}
/// 設定遮罩
func scanQRCodeBlackView(){
blackBackgroundView = UIView(frame: UIScreen.main.bounds)
blackBackgroundView.backgroundColor = UIColor.black
blackBackgroundView.alpha = 0.6
// 只有遮罩層覆蓋的地方才會顯示出來
blackBackgroundView.layer.mask = addTransparencyView(tempPath: scanQRcodePath)
blackBackgroundView.layer.name = "blackBackgroundView"
scanQRCodeView.addSubview(blackBackgroundView)
}
添加透明度視圖(摳圖)的 function
/// 添加透明度視圖(摳圖)
func addTransparencyView(tempPath: UIBezierPath?) -> CAShapeLayer? {
let path = UIBezierPath(rect: UIScreen.main.bounds)
if let tempPath = tempPath {
path.append(tempPath)
}
path.usesEvenOddFillRule = true
print(path)
let shapeLayer = CAShapeLayer()
shapeLayer.path = path.cgPath
// 其他颜色都可以,只要不是透明的
shapeLayer.fillColor = UIColor.black.cgColor
shapeLayer.fillRule = .evenOdd
return shapeLayer
}
明天將會繼續介紹 AVCaptureVideoPreviewLayer!拭目以待!
GitHub - AVCaptureVideoPreviewLayerDemo