身份認證(動畫、攝像頭)

前言

休了半年產(chǎn)假,回來發(fā)現(xiàn)快要不會寫代碼了。慢慢琢磨了一小段代碼僅供自己參考


效果.gif
思考

首先想需要再當前的view中間摳掉一個圓實現(xiàn)局部透明的遮罩效果。而 CAShapeLayerfillRule屬性可以幫我們實現(xiàn)這個過程。奇偶填充規(guī)則(Even Odd Fill Rule)指的是:在繪制 UIBezierPath 的過程中,會碰到同一個點被覆蓋多次的情況。當一個點被覆蓋偶數(shù)(0 屬于偶數(shù))次的時候,表示其位于圖像外,而奇數(shù)次則表示位于圖形內(nèi)。位于圖形內(nèi)的點會被填充顏色,位于圖形外的則不會??偨Y就是奇數(shù)填充,偶數(shù)不填充
那么:

let roundRect = CGRect(x: (ScreenWidth - 235) / 2.0, y: 100, width: 235, height: 235)
// 繪制第一個矩形path為當前view的視圖
let path = UIBezierPath(rect: UIScreen.main.bounds)
// 繪制第二個圓形path為攝像頭大小
let bezierPath = UIBezierPath(roundedRect: roundRect, cornerRadius: 235 / 2)
path.append(bezierPath)
let shaperLayer = CAShapeLayer()
// 奇數(shù)填充,偶數(shù)不填充
shaperLayer.fillRule = .evenOdd
shaperLayer.fillColor = UIColor.white.cgColor
shaperLayer.path = path.cgPath
view.layer.addSublayer(shaperLayer)
// 為方便看出效果,可以把當前的view視圖設置一個顏色
view.backgroundColor = UIColor.lightGray

運行之后可以看到如下效果:


奇偶填充規(guī)則.gif
添加外圈動畫

首先把圖片添加上去

let outImageView = UIImageView()
outImageView.image = UIImage(named: "face_animation_0")
view.addSubview(outImageView)
let imgCenterY = roundRect.origin.y + roundRect.height / 2.0
outImageView.snp.makeConstraints { (make) in
    make.centerX.equalToSuperview()
    make.centerY.equalTo(imgCenterY)
    make.size.equalTo(CGSize(width: 280, height: 280))
}
        
let inImageView = UIImageView()
inImageView.image = UIImage(named: "face_animation_1")
view.addSubview(inImageView)
inImageView.snp.makeConstraints { (make) in
     make.centerX.equalToSuperview()
     make.centerY.equalTo(imgCenterY)
     make.size.equalTo(CGSize(width: 270, height: 270))
}
圖片.png

給圖片添加動畫

let roationAnimation = CABasicAnimation(keyPath: "transform.rotation.z")
roationAnimation.fromValue = 0
roationAnimation.toValue = Double.pi * 2
roationAnimation.repeatCount = MAXFLOAT
roationAnimation.speed = 1
roationAnimation.duration = 3
roationAnimation.isRemovedOnCompletion = false
outImageView.layer.add(roationAnimation, forKey: nil)

let roationAnimation1 = CABasicAnimation(keyPath: "transform.rotation.z")
roationAnimation1.fromValue = 0
roationAnimation1.toValue = -Double.pi * 2
roationAnimation1.repeatCount = MAXFLOAT
roationAnimation1.speed = 1
roationAnimation1.duration = 3
roationAnimation1.isRemovedOnCompletion = false
inImageView.layer.add(roationAnimation1, forKey: nil)
動畫.gif
打開前置攝像頭
//音頻視頻相關類,記得在info.plist文件配置NSCameraUsageDescription
private var device: AVCaptureDevice!
private var videoPrelayer: AVCaptureVideoPreviewLayer!
private var input: AVCaptureDeviceInput!
private var output: AVCaptureStillImageOutput!
private var session: AVCaptureSession!

      //獲取后置攝像頭設備對象
      for item in AVCaptureDevice.devices(for: .video) {
                  if item.position == .front {
                      device = item
                  }
              }
      // 創(chuàng)建媒體管理會話
        session = AVCaptureSession()
       // 創(chuàng)建輸入數(shù)據(jù)對象
        input = try? AVCaptureDeviceInput.init(device: device)
        // 創(chuàng)建輸出數(shù)據(jù)對象
        output = AVCaptureStillImageOutput()
        output.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG]
        //添加輸入數(shù)據(jù)對象和輸出對象到會話中
        if session.canAddInput(input) {
            session.addInput(input)
        }
        if session.canAddOutput(output) {
            session.addOutput(output)
        }
        // 創(chuàng)建視頻預覽圖層
        videoPrelayer = AVCaptureVideoPreviewLayer.init(session: session)
        videoPrelayer.videoGravity = .resizeAspectFill
        videoPrelayer.frame = roundRect
        // 插入圖層在view視圖的最下方
        view.layer.insertSublayer(videoPrelayer, at: 0)
        session.startRunning()

運行,效果就出來了。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。