iT邦幫忙

2022 iThome 鐵人賽

DAY 18
0
Mobile Development

ios 的小小實驗室 2 !!系列 第 18

AVCaptureVideoPreviewLayer 3 - 掃描 QRCode - viewLayoutMarginsDidChange

  • 分享至 

  • xImage
  •  

今天會介紹 掃描的觸發回調設定掃描範圍與加上遮罩

  1. 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)
    }
    
  2. 添加透明度視圖(摳圖)的 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


上一篇
AVCaptureVideoPreviewLayer 2 - 掃描 QRCode - 生命週期
下一篇
AVCaptureVideoPreviewLayer 4 - AVCaptureMetadataOutputObjectsDelegate 1
系列文
ios 的小小實驗室 2 !!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言