一:实现自定义view,在.h,.m文件中代码如下:

#import <UIKit/UIKit.h>
@class ZLLockView;
@protocol ZLLockViewDelegate <NSObject>
- (void)lockView:(ZLLockView *)lockView didSelectedPwd: (NSString *)pwd;
@end
@interface ZLLockView : UIView
@property (nonatomic, weak) id<ZLLockViewDelegate> delegate; @end
//
// ZLLockView.m
// 手势解锁demo实现
//
// Created by Mac on 16/1/9.
// Copyright © 2016年 Mac. All rights reserved.
// #import "ZLLockView.h"
@interface ZLLockView()
@property (nonatomic, strong) NSMutableArray *btnsSelected; @property (nonatomic, assign) CGPoint lastPoint; @end
@implementation ZLLockView
- (NSMutableArray *)btnsSelected
{
if (!_btnsSelected) {
_btnsSelected = [NSMutableArray array];
}
return _btnsSelected;
}
- (instancetype)init
{
if (self = [super init]) {
[self setBtn];
}
return self;
}
- (void)setBtn
{
for (int i = ; i < ; i ++) {
UIButton *btn = [[UIButton alloc] init];
btn.tag = i; [btn setImage:[UIImage imageNamed:@"gesture_node_normal"] forState:UIControlStateNormal];
[btn setImage:[UIImage imageNamed:@"gesture_node_highlighted"] forState:UIControlStateSelected];
btn.userInteractionEnabled = NO;
[self addSubview:btn];
}
} // Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
// Drawing code
UIBezierPath *path = [UIBezierPath bezierPath];
path.lineWidth = ;
path.lineCapStyle = kCGLineCapRound;
path.lineJoinStyle = kCGLineJoinRound;
[[UIColor blueColor] set];
NSInteger count = self.btnsSelected.count;
if (count ==)return;
for (NSInteger i = ; i < count; i ++) {
UIButton *btn = self.btnsSelected[i];
if (i == ) {
[path moveToPoint:btn.center];
}else{
[path addLineToPoint:btn.center];
}
}
[path addLineToPoint:self.lastPoint];
[path stroke];
} - (void)layoutSubviews
{
CGFloat btnW = ;
CGFloat btnH = ;
// 间距
CGFloat padding = (self.frame.size.width - btnW * ) / ;
NSInteger count = self.subviews.count;
for (NSInteger i = ; i < count; i ++) {
UIButton *btn = self.subviews[i];
// 当前按钮所处的列
NSInteger column = i % ;
// 计算btn的x值
CGFloat btnX = (column+) * padding + column * btnW;
// 当前按钮所处的行
CGFloat row = i / ;
CGFloat btnY = (row+) * padding + row * btnW;
btn.frame = CGRectMake(btnX, btnY, btnW, btnH);
}
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[self touchesMoved:touches withEvent:event];
}
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
// 获取当前点
UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInView:touch.view];
// 判断在不在范围内
for (UIButton *btn in self.subviews) {
if (CGRectContainsPoint(btn.frame, location)) {//判断获得的点在不在范围内
//将选中的按钮放在数组里
if (btn.selected == NO) {
[self.btnsSelected addObject:btn];
}
[btn setSelected:YES];
}
else self.lastPoint = location;
}
[self setNeedsDisplay];
}
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
NSMutableString *pwd = [NSMutableString string]; for (UIButton *btn in self.btnsSelected) {
[btn setSelected:NO];
//拼接选中按钮的索引
[pwd appendFormat:@"%ld",btn.tag];
[self setNeedsDisplay];
}
[self.btnsSelected removeAllObjects];
NSLog(@"%@",pwd);
[self.delegate lockView:self didSelectedPwd:pwd];
}
@end

二:在控制器中实现代理方法,代码如下:

//
// ViewController.m
// 手势解锁demo实现
//
// Created by Mac on 16/1/9.
// Copyright © 2016年 Mac. All rights reserved.
// #import "ViewController.h"
#import "ZLLockView.h"
#import "MBProgressHUD+CZ.h"
@interface ViewController ()<ZLLockViewDelegate>
@property (nonatomic, strong) ZLLockView *lockView; @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"Home_refresh_bg"]];
// Do any additional setup after loading the view, typically from a nib.
ZLLockView *lockView = [[ZLLockView alloc] init];
CGFloat screenW = [UIScreen mainScreen].bounds.size.width;
lockView.frame = CGRectMake(, , screenW, screenW);
lockView.center = self.view.center;
lockView.backgroundColor = [UIColor clearColor];
[self.view addSubview:lockView];
self.lockView = lockView;
lockView.delegate = self; }
- (void) lockView:(ZLLockView *)lockView didSelectedPwd:(NSString *)pwd
{
if ([pwd isEqual:@""]) {
[MBProgressHUD showMessage:@"密码正确!"];
[self.lockView removeFromSuperview];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)( * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[MBProgressHUD hideHUD];
});
}else{
[MBProgressHUD showMessage:@"密码错误!"];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)( * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[MBProgressHUD hideHUD];
});
}
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} @end

三:效果:

2016-1-10 手势解锁demo的实现的更多相关文章

  1. [iOS UI进阶 - 5.0] 手势解锁Demo

    A.需求 1.九宫格手势解锁 2.使用了绘图和手势事件   code source: https://github.com/hellovoidworld/GestureUnlockDemo     B ...

  2. iOS-高仿支付宝手势解锁(九宫格)

    概述 高仿支付宝手势解锁, 通过手势枚举去实现手势密码相对应操作. 详细 代码下载:http://www.demodashi.com/demo/10706.html 基上篇[TouchID 指纹解锁] ...

  3. iOS--开发之手势解锁

    本文主要介绍通过手势识别实现手势解锁功能,这个方法被广泛用于手机解锁,密码验证,快捷支付等功能实现.事例效果如下所示. 首先,我们先分析功能的实现过程,首先我们需要先看大致的实现过程: 1.加载九宫格 ...

  4. ReactNative手势解锁(react-native-ok-gesture-password)

    在大前端的趋势之下,我也慢慢开始从事React Native相关的开发.但是奈何React Native生态相对于Android来说还是太小了.许多开源的库早早就已经不再维护.之前项目中需要用到手势解 ...

  5. canvas手势解锁源码

    先放图 demo.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  6. SJGestureUnlock快速集成手势解锁

    前言:如果页面显示不完整或图片看不了还请移步:简书 SJGestureUnlock.h 常用自定义属性 @interface SJGestureUnlock : UIView @property (n ...

  7. 微信iphone7、 ios10播放视频解决方案 2016.11.10

    2016.11.10日更新以下方法 微信最新出同层播放规范 即使是官方的也无法解决所有android手机的问题. 另外iphone 5 .5s 某些手机始终会弹出播放,请继续采用 “以下是老的解决办法 ...

  8. Quartz2D复习(二) --- 手势解锁

    这次支付宝手机客户端升级,把手势解锁那个功能去掉了,引起很多人的抱怨,觉得少了手势解锁的保护,个人信息容易泄漏了... 那么手势解锁功能是怎么是实现的呢,这里使用Quart2D来简单模拟一下, 先看下 ...

  9. HTML5实现屏幕手势解锁

    HTML5实现屏幕手势解锁(转载) https://github.com/lvming6816077/H5lockHow to use? <script type="text/java ...

随机推荐

  1. 打开Eclipse时出现"The Eclipse executable launcher was unable to locate its companion shared library"情况的解决办法

    在网上有坑,各种解决方法都有,但似乎我这台64位机器不太给面子,都不能解决: 结果自己找到了解决办法,总结了一下,大多数软件出问题,如果卸载了重新装还是出现问题,一般都是注册表残留的问题: 将ecli ...

  2. jmeter 建立一个监控测试计划

    监控 压力测试和系统管理是有用的. 使用压力 测试,服务器性能监控提供了额外的信息. 这也使得它更容易看到服务器性能之间的关系 在客户端和响应时间. 作为一个系统管理工具, 监控提供了一种简单的方法来 ...

  3. css slice和splice

    slice()方法从已有的数组中返回选定元素: slice(start,end)start:必需.规定从何处开始选取.如果是负数,那么它规定从数组尾部开始算起的位置.也就是说,-1 指最后一个元素,- ...

  4. [saiku] 免登陆进入管理后台

    上一篇分析了介绍了如何简化和修改saiku的界面[http://www.cnblogs.com/avivaye/p/4877882.html] 这一篇说明下如何去掉免登陆进入saiku 管理台 1.修 ...

  5. 《Java程序设计》实验三 实验报告

    实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程 2 ...

  6. phantomjs 乱码解决

    system = require('system') //传递一些需要的参数给js文件 address = system.args[1];//获得命令行第二个参数 ,也就是指定要加载的页面地址,接下来 ...

  7. sqlserver 导出数据库表结构和数据生成脚本

  8. 通过Sql语句导数据

    在通过SQL Server向导中的SQL语句导数据时,默认情况下源表中的nvarchar字段类型会变成202,解决此问题的方法是,要重新选择一下对应的数据接收表.

  9. Qt之QSystemTrayIcon

    简述 QSystemTrayIcon类为应用程序在系统托盘中提供一个图标. 现代操作系统通常在桌面上提供一个特殊的区域,称为系统托盘或通知区域,长时间运行的应用程序可以显示图标和短消息. 简述 内容 ...

  10. Qt之QRoundProgressBar(圆形进度条)

    简述 QRoundProgressBar类能够实现一个圆形进度条,继承自QWidget,并且有和QProgressBar类似的API接口. 简述 详细说明 风格 颜色 字体 共有函数 共有槽函数 详细 ...