身份認(rèn)證(動畫袖瞻、攝像頭)

前言

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


效果.gif
思考

首先想需要再當(dāng)前的view中間摳掉一個圓實現(xiàn)局部透明的遮罩效果聋迎。而 CAShapeLayerfillRule屬性可以幫我們實現(xiàn)這個過程。奇偶填充規(guī)則(Even Odd Fill Rule)指的是:在繪制 UIBezierPath 的過程中枣耀,會碰到同一個點被覆蓋多次的情況霉晕。當(dāng)一個點被覆蓋偶數(shù)(0 屬于偶數(shù))次的時候,表示其位于圖像外奕枢,而奇數(shù)次則表示位于圖形內(nèi)娄昆。位于圖形內(nèi)的點會被填充顏色佩微,位于圖形外的則不會缝彬。總結(jié)就是奇數(shù)填充哺眯,偶數(shù)不填充
那么:

let roundRect = CGRect(x: (ScreenWidth - 235) / 2.0, y: 100, width: 235, height: 235)
// 繪制第一個矩形path為當(dāng)前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)
// 為方便看出效果,可以把當(dāng)前的view視圖設(shè)置一個顏色
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
打開前置攝像頭
//音頻視頻相關(guān)類,記得在info.plist文件配置NSCameraUsageDescription
private var device: AVCaptureDevice!
private var videoPrelayer: AVCaptureVideoPreviewLayer!
private var input: AVCaptureDeviceInput!
private var output: AVCaptureStillImageOutput!
private var session: AVCaptureSession!

      //獲取后置攝像頭設(shè)備對象
      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)建視頻預(yù)覽圖層
        videoPrelayer = AVCaptureVideoPreviewLayer.init(session: session)
        videoPrelayer.videoGravity = .resizeAspectFill
        videoPrelayer.frame = roundRect
        // 插入圖層在view視圖的最下方
        view.layer.insertSublayer(videoPrelayer, at: 0)
        session.startRunning()

運行一疯,效果就出來了撼玄。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市墩邀,隨后出現(xiàn)的幾起案子掌猛,更是在濱河造成了極大的恐慌,老刑警劉巖眉睹,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荔茬,死亡現(xiàn)場離奇詭異,居然都是意外死亡竹海,警方通過查閱死者的電腦和手機慕蔚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來斋配,“玉大人孔飒,你說我怎么就攤上這事〖枵” “怎么了坏瞄?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長园细。 經(jīng)常有香客問我惦积,道長,這世上最難降的妖魔是什么猛频? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任狮崩,我火速辦了婚禮,結(jié)果婚禮上鹿寻,老公的妹妹穿的比我還像新娘睦柴。我一直安慰自己,他們只是感情好毡熏,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布坦敌。 她就那樣靜靜地躺著,像睡著了一般痢法。 火紅的嫁衣襯著肌膚如雪狱窘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天财搁,我揣著相機與錄音蘸炸,去河邊找鬼。 笑死尖奔,一個胖子當(dāng)著我的面吹牛搭儒,可吹牛的內(nèi)容都是我干的穷当。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼淹禾,長吁一口氣:“原來是場噩夢啊……” “哼馁菜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起铃岔,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤汪疮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后毁习,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铲咨,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年蜓洪,在試婚紗的時候發(fā)現(xiàn)自己被綠了纤勒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡隆檀,死狀恐怖摇天,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情恐仑,我是刑警寧澤泉坐,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站裳仆,受9級特大地震影響腕让,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜歧斟,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一纯丸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧静袖,春花似錦觉鼻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至捐康,卻和暖如春仇矾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背解总。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工贮匕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人倾鲫。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓粗合,卻偏偏與公主長得像,于是被迫代替她去往敵國和親乌昔。 傳聞我的和親對象是個殘疾皇子隙疚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354