使用Swift代码实现iOS手势解锁、指纹解锁实例详解

一、手势密码

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手势解锁、指纹解锁实例详解,希望对大家有所帮助!

(0)

相关推荐

  • iOS仿邮箱大师的九宫格手势密码解锁

    本文实例为大家分享了iOS手势密码解锁的相关代码,供大家参考,具体内容如下 // // LockView.m // 手势解锁 // // Created by Daniel on 16/4/4. // Copyright © 2016年 Daniel. All rights reserved. // #import "LockView.h" @interface LockView () /** 保存已选中的按钮 */ @property(nonatomic, strong) NSMut

  • iOS实现手势滑动解锁功能简析

    题记 在平常的生活中,我们大概经常遇见手势滑动解锁---也就是九宫格啊,已经出现好久了,虽然随着Apple的指纹解锁的发展手势解锁虽然还有但是因为其不如指纹解锁方便也用的也少了,但是在大多数APP中这两种方式都是并存的,比如qq,微信,支付宝等等,最近项目里面也刚好有这个需求,趁着刚完成抽出时间来记录下来当时的一些思路,可能有的地方理解的不到位,还需多总结,闲言少叙了,看重点. 功能描述如图:大概说一下思路,这个功能用来做相当于密令,用于两端的匹配,教师端设置了路径生成密码,储存在本地,学生端用

  • iOS实现手势解锁操作

    本文主要介绍通过手势识别实现手势解锁功能,这个方法被广泛用于手机解锁,密码验证,快捷支付等功能实现.事例效果如下所示. 首先,我们先分析功能的实现过程,首先我们需要先看大致的实现过程: 1.加载九宫格页面 2.实现按钮被点击及滑动过程中按钮状态的改变 3.实现滑动过程中的连线 4.绘制完毕后判定密码是否正确, 5.密码判定后实现跳转. 下面我们就来用代码实现上述五个过程. 1.加载九宫格界面 1.1九宫格内控件的分布 3*3 ,我们可以自定义view(包含3*3个按钮),添加到viewContr

  • 使用Swift代码实现iOS手势解锁、指纹解锁实例详解

    一.手势密码 1. 1.1.用UIButton组成手势的节点. 1.2.当手指接触屏幕时,调用重写的 touchesBegan:withEvent方法(在touchesBegan里调用setNeedsDisplay,这样就会自动调用drawRect方法). 1.3.当手指在屏幕上滑动时,调用重写的touchesEnded:withEvent方法. 这两个方法执行的操作是一样的:通过locationInView获取 触摸的坐标,然后用 CGRectContainsPoint 判断手指是否经过UIB

  • IOS 获取APP 版本号的实例详解

    IOS 获取APP 版本号的实例详解 看代码的时候看到一句,用于获取.plist文件的版本号 labelVersion.text = [NSString stringWithFormat:@"v%@", [[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString*)kCFBundleVersionKey]]; 比较感兴趣的是后面的参数 kcFBundleVersionKey ,竟然是CFBundle.h已经定于好的属性,下面有

  • IOS 创建并发线程的实例详解

    IOS 创建并发线程的实例详解 创建并发线程 主线程一般都是处理UI界面及用户交互的事儿的.其他的事一般就要另外的线程去处理,如下载,计算等... 现在先简单创建3个线程,分别打印出1-1000,,为了方便,线程3就放在主线程中执行. - (void) firstCounter{ @autoreleasepool { NSUInteger counter = 0; for (counter = 0; counter < 1000; counter++){ NSLog(@"First Cou

  • 基于iOS Realm数据库的使用实例详解

    首先下载Realm源代码,https://realm.io/cn/docs/objc/latest 将下载的文件解压,从 ios/static/ 目录中将 Realm.framework 拖曳到 Xcode 工程的文件导航器内,然后在 Xcode 文件导航器中选中工程.然后选择应用目标,前往 Build Phases 选项卡.在 Link Binary with Libraries 部分中单击 + 按钮,然后添加 libc++.tbd 和 libz.tbd.这样还没有完,我们还需要安装插件,打开

  • IOS UITableView颜色设置的实例详解

    IOS UITableView颜色设置的实例详解 1.系统默认的颜色设置  //无色 cell.selectionStyle = UITableViewCellSelectionStyleNone; //蓝色 cell.selectionStyle = UITableViewCellSelectionStyleBlue; //灰色 cell.selectionStyle = UITableViewCellSelectionStyleGray; 2.自定义颜色和背景设置 改变UITableView

  • IOS文件的简单读写实例详解

    IOS文件的简单读写实例详解 数组(可变与不可变)和字典(可变与不可变)中元素对象的类型,必须是NSString,NSArray,NSDictionary,NSData,否则不能直接写入文件 #pragma mark---NSString的写入与读取--- //1:获取路径 NSString *docunments = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObje

  • 微信小程序 监听手势滑动切换页面实例详解

    微信小程序 监听手势滑动切换页面实例详解 1.对应的xml里写上手势开始.滑动.结束的监听: <view class="touch" bindtouchstart="touchStart" bindtouchmove="touchMove" bindtouchend="touchEnd" ></view> 2.js: var touchDot = 0;//触摸时的原点 var time = 0;// 时

  • IOS 陀螺仪开发(CoreMotion框架)实例详解

    iOS陀螺仪 参数意义 self.mManager = [[CMMotionManager alloc]init]; self.mManager.deviceMotionUpdateInterval = 0.5; if (self.mManager.gyroAvailable) { [self.mManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:^(CMDeviceMotion

  • iOS如何自定义启动界面实例详解

    简介: 平常开发中对于启动页可能会有一些特别的要求,比如在启动页加动画或加一些按键可以响应事件等,最近项目中要在启动页增加版本号,因为版本号是不断的改变,所以要动态实现把它加到启动页上 正巧最近在重构app,原app用的是xcode自带的启动图设置.但相对来说自定义启动图可扩展性更强一点,今天花了一些时间弄了一下~ 实现思路: 思路是自定义一个控制器,在viewDidLoad的方法中调用要设置的启动图的方法,方法中主要是创建一个UIImageView,对UIImageView的image进行定义

  • iOS中的线程死锁实例详解

    什么是线程死锁 是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去. 线程死锁怎么发生 发生死锁的情况一般是两个对象的锁相互等待造成的. 死锁发生的条件 1.互斥条件:所谓互斥就是进程在某一时间内独占资源. 2.请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放. 3.不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺. 4.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系. 死锁通常是一个线程锁定了一

随机推荐