最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Swift代碼實(shí)現(xiàn)iOS手勢(shì)解鎖、指紋解鎖實(shí)例詳解

 更新時(shí)間:2016年06月03日 09:32:25   作者:云端之巔  
這篇文章主要介紹了使用Swift代碼實(shí)現(xiàn)iOS手勢(shì)解鎖、指紋解鎖的實(shí)現(xiàn)過(guò)程,非常不錯(cuò)具有參考借鑒價(jià)值,感興趣的朋友一起看看吧

一、手勢(shì)密碼

1、

1.1、用UIButton組成手勢(shì)的節(jié)點(diǎn)。

1.2、當(dāng)手指接觸屏幕時(shí),調(diào)用重寫(xiě)的 touchesBegan:withEvent方法(在touchesBegan里調(diào)用setNeedsDisplay,這樣就會(huì)自動(dòng)調(diào)用drawRect方法)。

1.3、當(dāng)手指在屏幕上滑動(dòng)時(shí),調(diào)用重寫(xiě)的touchesEnded:withEvent方法。

這兩個(gè)方法執(zhí)行的操作是一樣的:通過(guò)locationInView獲取 觸摸的坐標(biāo),然后用 CGRectContainsPoint 判斷手指是否經(jīng)過(guò)UIButton,如果經(jīng)過(guò)按鈕,就更換按鈕的圖片,同時(shí) 保存劃過(guò)按鈕的tag。

1.4、默認(rèn)情況下 跳躍連線(xiàn) 第1個(gè)和第3個(gè)節(jié)點(diǎn),中間的第2個(gè)節(jié)點(diǎn) 會(huì)被忽略,所以要單獨(dú)進(jìn)行處理。根據(jù)1和3節(jié)點(diǎn) 的2個(gè)UIButton的坐標(biāo) 計(jì)算出第1個(gè)和第3個(gè)節(jié)點(diǎn) 中間的坐標(biāo),判斷該坐標(biāo)是否存在UIButton,如果存在就加入設(shè)置選中,并加入選中數(shù)組。

到這里 就已經(jīng)實(shí)現(xiàn)了 手指滑過(guò) 節(jié)點(diǎn)的時(shí)候 節(jié)點(diǎn)被選中的效果:

 // MARK: - Override
 // 當(dāng)手指接觸屏幕時(shí),就會(huì)調(diào)用touchesBegan:withEvent方法;
 override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
  print("執(zhí)行touchesBegan")
  selectBtnTagArray.removeAll()
  touchesChange(touches)
 }
 //當(dāng)手指在屏幕上移動(dòng)時(shí),調(diào)用touchesMoved:withEvent方法;
 override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
  touchesChange(touches)
 }
 //當(dāng)觸摸被取消(比如觸摸過(guò)程中被來(lái)電打斷),就會(huì)調(diào)用touchesCancelled:withEvent方法。
 override func touchesCancelled(touches: Set<UITouch>?, withEvent event: UIEvent?) {
 }
 //當(dāng)手指離開(kāi)屏幕時(shí),就會(huì)調(diào)用touchesEnded:withEvent方法;
 override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
  print("執(zhí)行touchesEnded")
  var alertTitle = "請(qǐng)?jiān)O(shè)置正確的手勢(shì)"
  var alertMessage = "手勢(shì)密碼不能少于4個(gè)"
  var isSuccess = false
  if selectBtnTagArray.count >= 4 {
   alertTitle = "手勢(shì)密碼設(shè)置成功"
   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
   //兩個(gè)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 //不響應(yīng)用戶(hù)的交互。一定要加上這句
   gestureNodeBtn.setImage(UIImage(named: btnImgNormal), forState: .Normal)
   self.addSubview(gestureNodeBtn)
   btnArray.append(gestureNodeBtn)
  }
 }
 private func touchesChange(touches: Set<UITouch>) {
  //獲取 觸摸對(duì)象 ,觸摸對(duì)象的位置坐標(biāo)來(lái)實(shí)現(xiàn)
  gesturePoint = touches.first!.locationInView(self)
  for btn in btnArray {
   //判斷 手指的坐標(biāo) 是否在 button的坐標(biāo)里
   if !selectBtnTagArray.contains(btn.tag) && CGRectContainsPoint(btn.frame, gesturePoint) {
    //處理跳躍連線(xiàn)
    var lineCenterPoint:CGPoint = CGPoint()
    if selectBtnTagArray.count > 0 {
     lineCenterPoint = centerPoint(btn.frame.origin, endPoint: btnArray[selectBtnTagArray.last!].frame.origin)
    }
    //保存中間跳躍 過(guò)的節(jié)點(diǎn)
    for btn in btnArray {
     if !selectBtnTagArray.contains(btn.tag) && CGRectContainsPoint(btn.frame, lineCenterPoint) {
      btn.setImage(UIImage(named: btnImgSelected), forState: .Normal)
      selectBtnTagArray.append(btn.tag)
     }
    }
    //保存劃過(guò)的按鈕的tag
    selectBtnTagArray.append(btn.tag)
    btn.setImage(UIImage(named: btnImgSelected), forState: .Normal)
   }
  }
  //setNeedsDisplay會(huì)自動(dòng)調(diào)用drawRect方法 進(jìn)行畫(huà)線(xiàn)
  self.setNeedsDisplay()
 }
 //計(jì)算2個(gè)節(jié)點(diǎn)中心的坐標(biāo)
 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坐標(biāo): 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、畫(huà)線(xiàn):在drawRect方法中進(jìn)行畫(huà)線(xiàn)。

 override func drawRect(rect: CGRect) {
  print("執(zhí)行drawRect")
  let context = UIGraphicsGetCurrentContext() //獲取畫(huà)筆上下文
  var i = 0
  for tag in selectBtnTagArray {
   if (0 == i) {
    //開(kāi)始畫(huà)線(xiàn),設(shè)置直線(xiàn)的起點(diǎn)坐標(biāo)
    CGContextMoveToPoint(context, btnArray[tag].center.x, btnArray[tag].center.y)
   } else {
    //畫(huà)直線(xiàn),設(shè)置直線(xiàn)的終點(diǎn)坐標(biāo)
    CGContextAddLineToPoint(context, btnArray[tag].center.x,btnArray[tag].center.y)
   }
   i = i+1
  }
  //如果有選中的節(jié)點(diǎn),就取 跟著 手指的滑動(dòng) 畫(huà)線(xiàn)
  if (selectBtnTagArray.count > 0) {
   // 移除最后一條多余的線(xiàn),
   if gesturePoint != CGPointZero {
    CGContextAddLineToPoint(context, gesturePoint.x, gesturePoint.y)
   }
  }
  CGContextSetLineWidth(context, 10)  //設(shè)置畫(huà)筆寬度
  CGContextSetLineJoin(context, .Round) //兩個(gè)線(xiàn)相交點(diǎn) 平滑處理
  CGContextSetLineCap(context, .Round) //設(shè)置線(xiàn)條兩端的樣式為圓角
  CGContextSetRGBStrokeColor(context, 227/255.0, 54/255.0, 58/255.0, 1)
  CGContextStrokePath(context)   // //對(duì)線(xiàn)條進(jìn)行渲染
 }

二、指紋驗(yàn)證

iPhone 的Home鍵 上的金屬環(huán) 能感應(yīng)手指,通知Touch ID 讀取指紋,Touch ID 傳感器 可以拍攝 皮膚 皮下層指紋。

每次使用指紋,Touch ID 會(huì)持續(xù)的添加新的指紋特性,進(jìn)一步提高準(zhǔn)確、安全性。

Touch ID 不會(huì)儲(chǔ)存指紋的圖像。它只存儲(chǔ)指紋的數(shù)學(xué)表達(dá)式。設(shè)備中的芯片還包含稱(chēng)為“Secure Enclave”的高級(jí)安全架構(gòu),專(zhuān)門(mén)用于保護(hù)密碼和指紋數(shù)據(jù)。指紋數(shù)據(jù)通過(guò) Secure Enclave 的專(zhuān)用密鑰得到加密和保護(hù)。iOS 和其他 app 絕不會(huì)訪(fǎng)問(wèn)您的指紋數(shù)據(jù),指紋數(shù)據(jù)絕不會(huì)存儲(chǔ)到 Apple 服務(wù)器、 iCloud 或其他地方。

1、  import LocalAuthentication

2、用 LAContext 類(lèi)的  canEvaluatePolicy 方法 判斷設(shè)備是否支持指紋,然后用 evaluatePolicy 方法 來(lái)進(jìn)行指紋驗(yàn)證。

執(zhí)行evaluatePolicy方法,系統(tǒng)會(huì)自動(dòng)彈出 驗(yàn)證指紋的提示框,提示副標(biāo)題可以自己設(shè)定。

如果輸入錯(cuò)誤后,系統(tǒng)會(huì)自動(dòng)進(jìn)入“再試一次”的提示框,點(diǎn)擊右邊的 “輸入密碼”選項(xiàng),要自己寫(xiě)代碼實(shí)現(xiàn) 輸入密碼的彈框。

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

以上所述是小編給大家介紹的使用Swift代碼實(shí)現(xiàn)iOS手勢(shì)解鎖、指紋解鎖實(shí)例詳解,希望對(duì)大家有所幫助!

相關(guān)文章

  • iOS滑動(dòng)解鎖、滑動(dòng)獲取驗(yàn)證碼效果的實(shí)現(xiàn)代碼

    iOS滑動(dòng)解鎖、滑動(dòng)獲取驗(yàn)證碼效果的實(shí)現(xiàn)代碼

    這篇文章主要介紹了iOS滑動(dòng)解鎖、滑動(dòng)獲取驗(yàn)證碼效果的實(shí)現(xiàn)代碼,小編認(rèn)為還不錯(cuò),非常實(shí)用,所有分享給大家,感興趣的朋友可以參考下
    2016-05-05
  • iOS開(kāi)發(fā)中用imageIO漸進(jìn)加載圖片及獲取exif的方法

    iOS開(kāi)發(fā)中用imageIO漸進(jìn)加載圖片及獲取exif的方法

    這篇文章主要介紹了iOS開(kāi)發(fā)中中用imageIO漸進(jìn)加載圖片及獲取exif的方法,代碼演示為傳統(tǒng)的Objective-C,需要的朋友可以參考下
    2015-09-09
  • iOS中的通知機(jī)制

    iOS中的通知機(jī)制

    網(wǎng)上經(jīng)常說(shuō)iOS的通知機(jī)制是使用了觀(guān)察者模式,里面有兩個(gè)角色,其一是poster(發(fā)送者),另一個(gè)是observer(接受信息的訂閱者)。接下來(lái)通過(guò)本文給大家介紹iOS中的通知機(jī)制,感興趣的朋友一起學(xué)習(xí)吧
    2016-04-04
  • iOS動(dòng)態(tài)更換Icon的全過(guò)程記錄

    iOS動(dòng)態(tài)更換Icon的全過(guò)程記錄

    這篇文章主要給大家介紹了關(guān)于iOS動(dòng)態(tài)更換Icon的全過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位iOS開(kāi)發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 解析iOS內(nèi)存不足時(shí)的警告以及處理過(guò)程

    解析iOS內(nèi)存不足時(shí)的警告以及處理過(guò)程

    這篇文章主要介紹了iOS內(nèi)存不足時(shí)的警告以及處理過(guò)程,包括View Controller和生命周期等相關(guān)方面的知識(shí),需要的朋友可以參考下
    2015-10-10
  • iOS CoreMotion實(shí)現(xiàn)設(shè)備運(yùn)動(dòng)加速度計(jì)陀螺儀

    iOS CoreMotion實(shí)現(xiàn)設(shè)備運(yùn)動(dòng)加速度計(jì)陀螺儀

    這篇文章主要介紹了iOS CoreMotion實(shí)現(xiàn)設(shè)備運(yùn)動(dòng)加速度計(jì)陀螺儀,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • 手把手教你實(shí)現(xiàn)微信小視頻iOS代碼實(shí)現(xiàn)

    手把手教你實(shí)現(xiàn)微信小視頻iOS代碼實(shí)現(xiàn)

    這篇文章主要手把手教你實(shí)現(xiàn)微信小視頻,iOS代碼實(shí)現(xiàn)微信小視頻功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Nib文件是什么?Nib文件打開(kāi)方法

    Nib文件是什么?Nib文件打開(kāi)方法

    這篇文章主要介紹了Nib文件是什么?Nib文件打開(kāi)方法,nib文件是Cocoa App的界面資源,這種文件直接用xcode是不能被打開(kāi)的,要修改后才能打開(kāi),本文就講解了修改方法,需要的朋友可以參考下
    2015-04-04
  • iOS實(shí)現(xiàn)圖片自動(dòng)切換效果

    iOS實(shí)現(xiàn)圖片自動(dòng)切換效果

    這篇文章主要為大家詳細(xì)介紹了iOS實(shí)現(xiàn)圖片自動(dòng)切換效果,類(lèi)似android畫(huà)廊效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • iOS異步下載圖片實(shí)例代碼

    iOS異步下載圖片實(shí)例代碼

    這篇文章主要介紹了iOS異步下載圖片實(shí)例代碼的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-08-08

最新評(píng)論

台中市| 深州市| 黄浦区| 宣化县| 黄山市| 德州市| 边坝县| 杂多县| 敖汉旗| 磴口县| 鄯善县| 阿巴嘎旗| 古交市| 横山县| 吉隆县| 尖扎县| 绥德县| 佛山市| 商城县| 福安市| 嵊州市| 嘉黎县| 蓬安县| 林甸县| 岳池县| 河间市| 湘潭市| 巴楚县| 吉安市| 子洲县| 张家口市| 栾川县| 启东市| 荆门市| 武川县| 炎陵县| 洛浦县| 灵丘县| 永康市| 东山县| 墨脱县|