使用Swift代碼實現iOS手勢解鎖、指紋解鎖執行個體詳解_IOS

來源:互聯網
上載者:User

一、手勢密碼

1、

1.1、用UIButton組成手勢的節點。

1.2、當手指接觸螢幕時,調用重寫的 touchesBegan:withEvent方法(在touchesBegan裡調用setNeedsDisplay,這樣就會自動調用drawRect方法)。

1.3、當手指在螢幕上滑動時,調用重寫的touchesEnded:withEvent方法。

這兩個方法執行的操作是一樣的:通過locationInView擷取 觸摸的座標,然後用 CGRectContainsPoint 判斷手指是否經過UIButton,如果經過按鈕,就更換按鈕的圖片,同時 儲存划過按鈕的tag。

1.4、預設情況下 跳躍連線 第1個和第3個節點,中間的第2個節點 會被忽略,所以要單獨進行處理。根據1和3節點 的2個UIButton的座標 計算出第1個和第3個節點 中間的座標,判斷該座標是否存在UIButton,如果存在就加入設定選中,並加入選中數組。

到這裡 就已經實現了 手指滑過 節點的時候 節點被選中的效果:

 // MARK: - Override // 當手指接觸螢幕時,就會調用touchesBegan:withEvent方法; override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {  print("執行touchesBegan")  selectBtnTagArray.removeAll()  touchesChange(touches) } //當手指在螢幕上移動時,調用touchesMoved:withEvent方法; override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {  touchesChange(touches) } //當觸摸被取消(比如觸摸過程中被來電打斷),就會調用touchesCancelled:withEvent方法。 override func touchesCancelled(touches: Set<UITouch>?, withEvent event: UIEvent?) { } //當手指離開螢幕時,就會調用touchesEnded:withEvent方法; override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {  print("執行touchesEnded")  var alertTitle = "請設定正確的手勢"  var alertMessage = "手勢密碼不能少於4個"  var isSuccess = false  if selectBtnTagArray.count >= 4 {   alertTitle = "手勢密碼設定成功"   isSuccess = true   alertMessage = "密碼為:\(selectBtnTagArray)"  }  gestureLockDelegate!.gestureLockSuccess(isSuccess, title: alertTitle, message: alertMessage)  gesturePoint = CGPointZero;  self.setNeedsDisplay() } // MARK: - PrivateMethod private func initButtons() {  for i in 0...8 {   //第幾行   let row = i / 3   let loc = i % 3   //兩個button的間距   let btnSpace = (screenWidth - 3*btnWH)/4   let btnX = btnSpace + (btnWH + btnSpace) * CGFloat(loc)   let btnY = 70 + btnSpace + (btnWH + btnSpace) * CGFloat(row)   let gestureNodeBtn = UIButton(frame:CGRectMake(btnX, btnY, btnWH, btnWH))   gestureNodeBtn.tag = i   gestureNodeBtn.userInteractionEnabled = false //不響應使用者的互動。一定要加上這句   gestureNodeBtn.setImage(UIImage(named: btnImgNormal), forState: .Normal)   self.addSubview(gestureNodeBtn)   btnArray.append(gestureNodeBtn)  } } private func touchesChange(touches: Set<UITouch>) {  //擷取 觸摸對象 ,觸摸對象的位置座標來實現  gesturePoint = touches.first!.locationInView(self)  for btn in btnArray {   //判斷 手指的座標 是否在 button的座標裡   if !selectBtnTagArray.contains(btn.tag) && CGRectContainsPoint(btn.frame, gesturePoint) {    //處理跳躍連線    var lineCenterPoint:CGPoint = CGPoint()    if selectBtnTagArray.count > 0 {     lineCenterPoint = centerPoint(btn.frame.origin, endPoint: btnArray[selectBtnTagArray.last!].frame.origin)    }    //儲存中間跳躍 過的節點    for btn in btnArray {     if !selectBtnTagArray.contains(btn.tag) && CGRectContainsPoint(btn.frame, lineCenterPoint) {      btn.setImage(UIImage(named: btnImgSelected), forState: .Normal)      selectBtnTagArray.append(btn.tag)     }    }    //儲存划過的按鈕的tag    selectBtnTagArray.append(btn.tag)    btn.setImage(UIImage(named: btnImgSelected), forState: .Normal)   }  }  //setNeedsDisplay會自動調用drawRect方法 進行畫線  self.setNeedsDisplay() } //計算2個節點中心的座標 private func centerPoint(startPoint: CGPoint, endPoint:CGPoint) -> CGPoint {  let rightPoint = startPoint.x > endPoint.x ? startPoint.x : endPoint.x  let leftPoint = startPoint.x < endPoint.x ? startPoint.x : endPoint.x  let topPoint = startPoint.y > endPoint.y ? startPoint.y : endPoint.y  let bottomPoint = startPoint.y < endPoint.y ? startPoint.y : endPoint.y  //x座標: leftPoint +(rightPoint-leftPoint)/2 = (rightPoint+leftPoint)/2  return CGPointMake((rightPoint + leftPoint)/2 + btnWH/2, (topPoint + bottomPoint)/2 + btnWH/2); } func recoverNodeStatus() {  selectBtnTagArray.removeAll()  for btn in btnArray {   btn.setImage(UIImage(named: btnImgNormal), forState: .Normal)  }  self.setNeedsDisplay() }

2、畫線:在drawRect方法中進行畫線。

 override func drawRect(rect: CGRect) {  print("執行drawRect")  let context = UIGraphicsGetCurrentContext() //擷取畫筆上下文  var i = 0  for tag in selectBtnTagArray {   if (0 == i) {    //開始畫線,設定直線的起點座標    CGContextMoveToPoint(context, btnArray[tag].center.x, btnArray[tag].center.y)   } else {    //畫直線,設定直線的終點座標    CGContextAddLineToPoint(context, btnArray[tag].center.x,btnArray[tag].center.y)   }   i = i+1  }  //如果有選中的節點,就取 跟著 手指的滑動 畫線  if (selectBtnTagArray.count > 0) {   // 移除最後一條多餘的線,   if gesturePoint != CGPointZero {    CGContextAddLineToPoint(context, gesturePoint.x, gesturePoint.y)   }  }  CGContextSetLineWidth(context, 10)  //設定畫筆寬度  CGContextSetLineJoin(context, .Round) //兩個線相交點 平滑處理  CGContextSetLineCap(context, .Round) //設定線條兩端的樣式為圓角  CGContextSetRGBStrokeColor(context, 227/255.0, 54/255.0, 58/255.0, 1)  CGContextStrokePath(context)   // //對線條進行渲染 }

二、指紋驗證

iPhone 的Home鍵 上的金屬環 能感應手指,通知Touch ID 讀取指紋,Touch ID 感應器 可以拍攝 皮膚 皮下層指紋。

每次使用指紋,Touch ID 會持續的添加新的指紋特性,進一步提高準確、安全性。

Touch ID 不會儲存指紋的映像。它只儲存指紋的數學運算式。裝置中的晶片還包含稱為“Secure Enclave”的進階安全架構,專門用於保護密碼和指紋資料。指紋資料通過 Secure Enclave 的專用密鑰得到加密和保護。iOS 和其他 app 絕不會訪問您的指紋資料,指紋資料絕不會儲存到 Apple 伺服器、 iCloud 或其他地方。

1、  import LocalAuthentication

2、用 LAContext 類的  canEvaluatePolicy 方法 判斷裝置是否支援指紋,然後用 evaluatePolicy 方法 來進行指紋驗證。

執行evaluatePolicy方法,系統會自動彈出 驗證指紋的提示框,提示副標題可以自己設定。

如果輸入錯誤後,系統會自動進入“再試一次”的提示框,點擊右邊的 “輸入密碼”選項,要自己寫代碼實現 輸入密碼的彈框。

Demo地址:https://github.com/bugaoshuni/TouchIDAndGestureLock

以上所述是小編給大家介紹的使用Swift代碼實現iOS手勢解鎖、指紋解鎖執行個體詳解,希望對大家有所協助!

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.