一、手势密码

1、

1.1、用UIButton组成手势的节点。

1.2、当手指接触屏幕时,调用重写的 touchesBegan:withEvent方法(在touchesBegan里调用setNeedsDisplay,这样就会自动调用drawRect方法)。

1.3、当手指在屏幕上滑动时,调用重写的touchesMoved: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 >= {
alertTitle = "手势密码设置成功"
isSuccess = true
alertMessage = "密码为:\(selectBtnTagArray)"
} gestureLockDelegate!.gestureLockSuccess(isSuccess, title: alertTitle, message: alertMessage) gesturePoint = CGPointZero;
self.setNeedsDisplay()
} // MARK: - PrivateMethod
private func initButtons() {
for i in ... {
//第几行
let row = i /
let loc = i % //两个button的间距
let btnSpace = (screenWidth - *btnWH)/
let btnX = btnSpace + (btnWH + btnSpace) * CGFloat(loc)
let btnY = + 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 > {
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)/ + btnWH/, (topPoint + bottomPoint)/ + btnWH/);
} 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 =
for tag in selectBtnTagArray {
if ( == i) {
//开始画线,设置直线的起点坐标
CGContextMoveToPoint(context, btnArray[tag].center.x, btnArray[tag].center.y)
} else {
//画直线,设置直线的终点坐标
CGContextAddLineToPoint(context, btnArray[tag].center.x,btnArray[tag].center.y)
}
i = i+
} //如果有选中的节点,就取 跟着 手指的滑动 画线
if (selectBtnTagArray.count > ) {
// 移除最后一条多余的线,
if gesturePoint != CGPointZero {
CGContextAddLineToPoint(context, gesturePoint.x, gesturePoint.y)
}
} CGContextSetLineWidth(context, ) //设置画笔宽度
CGContextSetLineJoin(context, .Round) //两个线相交点 平滑处理
CGContextSetLineCap(context, .Round) //设置线条两端的样式为圆角
CGContextSetRGBStrokeColor(context, /255.0, /255.0, /255.0, )
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方法,系统会自动弹出 验证指纹的提示框,提示副标题可以自己设定。

如果输入错误后,系统会自动进入“再试一次”的提示框,点击右边的 “输入密码”选项,要自己写代码实现 输入密码的弹框。

Swift Touch ID 代码

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

欢迎关注我的 今日头条号 名称: 云端梦想科技

欢迎关注我的 微信公众号:dreams2999

iOS手势解锁、指纹解锁--Swift代码的更多相关文章

  1. iOS --- Touch ID指纹解锁

    https://www.cnblogs.com/ljmaque/p/TouchID.html 最近在项目中刚好用到了TouchId指纹解锁功能,之前也没有接触过,立马百度看看究竟是要如何使用,发现其实 ...

  2. iOS开发之指纹解锁

    http://blog.csdn.net/hongfengkt/article/details/49868073 前一阵子一直在赶项目进度,没有太多时间写博客,现在终于空闲了,将以前欠下的博客补上来. ...

  3. iOS 指纹解锁

    目前常用的App支持指纹解锁的还不是很多,如果在你的项目中用一下是不是显得高大上呢? 废话不说多,干货- 1.在工程中添加LocalAuthentication.framework 2.在需要验证的c ...

  4. iOS 指纹解锁 验证TouchID

    iOS指纹解锁 1.首先,引入依赖框架 LocalAuthentication.framework #import <LocalAuthentication/LocalAuthenticatio ...

  5. swift 实现iOS手势密码、指纹密码、faceID

    本博客包含了如何实现iOS手势密码.指纹密码.faceID全步骤,包括了完整的代码. 先附上demo地址https://github.com/Liuyubao/LYBTouchID,支持swift3. ...

  6. 基于 LocalAuthentication 框架的指纹解锁

    效果 想必大家对 iPhone 的指纹解锁功能已经相当的熟悉了.来看看效果吧! Local Authentication 概述 Local Authentication 框架提供了按照指定的安全策略请 ...

  7. iOS9 集成指纹解锁

    添加依赖库 LocalAuthentication.framework #import <LocalAuthentication/LocalAuthentication.h> // 头文件 ...

  8. TouchID 指纹解锁

    概述 TouchID 指纹解锁 详细 代码下载:http://www.demodashi.com/demo/10701.html 一.软硬件支持 指纹验证功能的最低硬件支持为iPhone5s, iPa ...

  9. 新iPhone有望加入指纹解锁,你会买吗?

    苹果新款iPhone即将在9月份正式发布,或命名为iPhone 13或者iPhone 12s.据外媒报道,新一代iPhone的屏幕和相机都将迎来重大升级,同时还将首次加入屏下指纹解锁技术.你期待吗? ...

  10. iOS Swift-元组tuples(The Swift Programming Language)

    iOS Swift-元组tuples(The Swift Programming Language) 什么是元组? 元组(tuples)是把多个值组合成一个复合值,元组内的值可以使任意类型,并不要求是 ...

随机推荐

  1. Unity3d学习 相机的跟随

    最近在写关于相机跟随的逻辑,其实最早接触相机跟随是在Unity官网的一个叫Roll-a-ball tutorial上,其中简单的涉及了关于相机如何跟随物体的移动而移动,如下代码: using Unit ...

  2. wepack+sass+vue 入门教程(三)

    十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...

  3. 懒加载session 无法打开 no session or session was closed 解决办法(完美解决)

           首先说明一下,hibernate的延迟加载特性(lazy).所谓的延迟加载就是当真正需要查询数据时才执行数据加载操作.因为hibernate当中支持实体对象,外键会与实体对象关联起来.如 ...

  4. 微信小程序体验(2):驴妈妈景区门票即买即游

    驴妈妈因为出色的运营能力,被腾讯选为首批小程序内测单位.驴妈妈的技术开发团队在很短的时间内完成了开发任务,并积极参与到张小龙团队的内测问题反馈.驴妈妈认为,移动互联网时代,微信是巨大的流量入口,也是旅 ...

  5. SQL Server常见数据类型介绍

    数据表是由多个列组成,创建表时必须明确每个列的数据类型,以下列举SQL Server常见数据类型的使用规则,方便查阅. 1.整数类型 int 存储范围是-2,147,483,648到2,147,483 ...

  6. 最好的.NET开源免费ZIP库DotNetZip(.NET组件介绍之三)

    在项目开发中,除了对数据的展示更多的就是对文件的相关操作,例如文件的创建和删除,以及文件的压缩和解压.文件压缩的好处有很多,主要就是在文件传输的方面,文件压缩的好处就不需要赘述,因为无论是开发者,还是 ...

  7. 利用Select2优化@Html.ListBoxFor显示,学会用MultiSelectList

    最近需要用到多选框,Asp.Net MVC自带的@Html.ListBox或@Html.ListBoxFor的显示效果太差,于是找到了Select2进行优化,并正式了解了多选框的操作方法. 首先介绍多 ...

  8. Android Socket连接PC出错问题及解决

    最近测试问题:Android 通过Socket链接电脑,ip和端口都是正确的,也在同一网段,可android端就是报异常如下: 解决办法:测试电脑的防火墙可能开着,在控制面板把防火墙打开即可.

  9. 敏捷转型历程 - Sprint3 一团糟的演示会

    我: Tech Leader 团队:团队成员分布在两个城市,我所在的城市包括我有4个成员,另外一个城市包括SM有7个成员.另外由于我们的BA离职了,我暂代IT 的PO 职位.PM和我在一个城市,但他不 ...

  10. 使用Hudson搭建自动构建服务器

    环境: ubuntu1404_x64 说明: 使用hudson和git搭建自动构建服务器的简单示例 安装hudson及相关插件 安装hudson 安装命令如下: sudo sh -c "ec ...