现搭建页面

//  VCView.h
//  06-手势解锁#import <UIKit/UIKit.h>@interface VCView : UIView@end//  VCView.m
//  06-手势解锁#import "VCView.h"@implementation VCView
- (void)drawRect:(CGRect)rect
{// 绘图图像UIImage *image = [UIImage imageNamed:@"Home_refresh_bg"];[image drawInRect:rect];}@end//  LockView.h
//  06-手势解锁
#import <UIKit/UIKit.h>@interface LockView : UIView@end//  LockView.m
//  06-手势解锁#import "LockView.h"@implementation LockView// 加载完xib的时候调用
- (void)awakeFromNib
{// 创建9个按钮for ( int i = 0; i < 9; i++) {UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];[btn setImage:[UIImage imageNamed:@"gesture_node_normal"] forState:UIControlStateNormal];[btn setImage:[UIImage imageNamed:@"gesture_node_highlighted"] forState:UIControlStateSelected];[self addSubview:btn];}
}// 为什么要在这个方法布局子控件,因为只要一调用这个方法,就表示父控件的尺寸确定
- (void)layoutSubviews
{[super layoutSubviews];NSUInteger count = self.subviews.count;int cols = 3;CGFloat x = 0;CGFloat y = 0;CGFloat w = 74;CGFloat h = 74;CGFloat margin = (self.bounds.size.width - cols * w) / (cols + 1);CGFloat col = 0;CGFloat row = 0;for (NSUInteger i = 0; i < count; i++) {UIButton *btn = self.subviews[i];// 获取当前按钮的列数col = i % cols;row = i / cols;x = margin + col * (margin + w);y = row * (margin + w);btn.frame = CGRectMake(x, y, w, h);}}@end

07-手势解锁(按钮选中和连线)

//  VCView.m
//  06-手势解锁
#import "VCView.h"@implementation VCView
- (void)drawRect:(CGRect)rect
{// 绘图图像UIImage *image = [UIImage imageNamed:@"Home_refresh_bg"];[image drawInRect:rect];}@end

//  LockView.m
//  06-手势解锁
#import "LockView.h"@interface LockView ()@property (nonatomic, strong) NSMutableArray *selectedsBtn;@property (nonatomic, assign) CGPoint curP;@end@implementation LockView- (NSMutableArray *)selectedsBtn
{if (_selectedsBtn == nil) {_selectedsBtn = [NSMutableArray array];}return _selectedsBtn;
}- (IBAction)pan:(UIPanGestureRecognizer *)pan
{// 获取触摸点_curP = [pan locationInView:self];// 判断触摸点在不在按钮上for (UIButton *btn in self.subviews) {// 点在不在某个范围内,并且按钮没有被选中if (CGRectContainsPoint(btn.frame, _curP) && btn.selected == NO) {// 点在按钮上btn.selected = YES;// 保存到数组中
            [self.selectedsBtn addObject:btn];}}// 重绘
    [self setNeedsDisplay];if (pan.state == UIGestureRecognizerStateEnded) {// 创建可变字符串NSMutableString *strM = [NSMutableString string];// 保存输入密码for (UIButton *btn in self.selectedsBtn) {[strM appendFormat:@"%ld",btn.tag];}NSLog(@"%@",strM);// 还原界面// 取消所有按钮的选中
        [self.selectedsBtn makeObjectsPerformSelector:@selector(setSelected:) withObject:@(NO)];// 清除画线,把选中按钮清空
        [self.selectedsBtn removeAllObjects];}}
// 加载完xib的时候调用
- (void)awakeFromNib
{// 创建9个按钮for ( int i = 0; i < 9; i++) {UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];// 不允许用户交互,按钮就不能点击,也就不能达到高亮状态btn.userInteractionEnabled = NO;[btn setImage:[UIImage imageNamed:@"gesture_node_normal"] forState:UIControlStateNormal];[btn setImage:[UIImage imageNamed:@"gesture_node_highlighted"] forState:UIControlStateSelected];btn.tag = i;[self addSubview:btn];}
}// 为什么要在这个方法布局子控件,因为只要一调用这个方法,就表示父控件的尺寸确定
- (void)layoutSubviews
{[super layoutSubviews];NSUInteger count = self.subviews.count;int cols = 3;CGFloat x = 0;CGFloat y = 0;CGFloat w = 74;CGFloat h = 74;CGFloat margin = (self.bounds.size.width - cols * w) / (cols + 1);CGFloat col = 0;CGFloat row = 0;for (NSUInteger i = 0; i < count; i++) {UIButton *btn = self.subviews[i];// 获取当前按钮的列数col = i % cols;row = i / cols;x = margin + col * (margin + w);y = row * (margin + w);btn.frame = CGRectMake(x, y, w, h);}}// 只要调用这个方法,就会把之前绘制的东西全部清掉,重新绘制
- (void)drawRect:(CGRect)rect
{// 没有选中按钮,不需要连线if (self.selectedsBtn.count == 0) return;// 把所有选中按钮中心点连线UIBezierPath *path = [UIBezierPath bezierPath];NSUInteger count = self.selectedsBtn.count;// 把所有选中按钮之间都连好线for (int i = 0; i < count; i++) {UIButton *btn = self.selectedsBtn[i];if (i == 0) {// 设置起点
            [path moveToPoint:btn.center];}else{[path addLineToPoint:btn.center];}}// 连线到手指的触摸点
    [path addLineToPoint:_curP];[[UIColor greenColor] set];path.lineWidth = 10;path.lineJoinStyle = kCGLineJoinRound;[path stroke];}@end

转载于:https://www.cnblogs.com/laugh/p/6677614.html

源码0306-手势解锁相关推荐

  1. android九宫格密码源码,Android九宫格解锁的实现

    主要代码如下 xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_par ...

  2. 精尽 Redisson 源码分析 —— 可重入分布式锁 ReentrantLock

    1. 概述 在 Redisson 中,提供了 8 种分布锁的实现,具体我们可以在 <Redisson 文档 -- 分布式锁和同步器> 中看到.绝大数情况下,我们使用可重入锁(Reentra ...

  3. [源码]Android安卓应用手势锁图案解锁的实现

    交互细节 用户首先使用账号/密码进行登录. 登录成功后,判断是否是第一次登录使用,如果是第一次则显示创建手势密码的界面,要求用户创建手势锁. 创建的过程中要求用户连接至少四个点,并且绘制两次以确认绘制 ...

  4. android手势密码源码,Android自定义UI手势密码改进版源码下载

    在之前文章的铺垫下,再为大家分享一篇:Android手势密码,附源码下载,不要错过. 先看第一张图片的布局文件 activity_main.xml xmlns:tools="http://s ...

  5. Android图案密码,手势锁源码解析

    Android图案密码解锁源码解析 Android Lock Pattern 源码解析  1. 介绍   1.1 关于 Android 的图案密码解锁,通过手势连接 3 * 3 的点矩阵绘制图案表示解 ...

  6. ios开发学习-手势交互(Gesture)效果源码分享

    qianqianlianmeng ios开发学习-手势交互(Gesture)效果源码分享 All Around Pull View 介绍:实现视图四个方向(上下左右)都能够拖动更新(pull to r ...

  7. 带手势划动功能的日历源码

    2019独角兽企业重金招聘Python工程师标准>>> 带手势划动功能的日历源码 转载:http://www.adobex.com/android/source/details/00 ...

  8. 缩放手势 ScaleGestureDetector 源码解析,这一篇就够了

    其实在我们日常的编程中,对于缩放手势的使用并不是很经常,这一手势主要是用在图片浏览方面,比如下方例子.但是(敲重点),作为 Android 入门的基础来说,学习 ScaleGestureDetecto ...

  9. Unity+SenseAR教程 | 用手势发射爱心2:加入发射方向【源码】

    摘要:Unity+SenseAR2.3开发的AR应用,基于手势识别同时计算手势方向,发射你的爱心~ 洪流学堂,让你快人几步.你好,我是你的技术探路者郑洪智,你可以叫我大智. 这篇教程是为了填上一篇教程 ...

最新文章

  1. php insert failed,较大的MySQL INSERT语句导致PHP错误
  2. 9 个重量级的云计算(PaaS)平台
  3. Stanford机器学习笔记-4. 神经网络Neural Networks (part one)
  4. Nginx的upstream_response_time
  5. Redis内存使用优化与存储
  6. 宣布JavaScript 2017状况调查
  7. android主流技术框架,android开发现在流行什么IDE和开发框架?
  8. D3.js、echar.js 前端必备大数据技能
  9. 郑大中科院合作计算机系,郑大一本今年在河南招4320人 本科新增5个专业
  10. 界面控件包Essential Studio for Windows Forms 2017 v3发布丨附下载
  11. 什么是原子性,什么是原子性操作?
  12. android 系统相册调用,各版本的区别总结
  13. 前端实现PDF文件下载的两种方式
  14. 闪灵CMS插件自动采集文章主动推送给搜索引擎
  15. List异常报错:list All elements are null
  16. TQ2440开发板学习纪实(4)--- 初始化片外RAM,让程序有更大内存空间
  17. [爬虫]requests+正则表达式爬取猫眼电影TOP100
  18. 为什么要从 Windows 7 升级到 Windows 10?
  19. 鲜为人知 的 人名典故
  20. 关闭msmpeng_你知道吗?把电脑系统里的这些进程关闭掉,可以提升系统流畅

热门文章

  1. [转]android selector 背景选择器
  2. Global.asax
  3. Win7编译volley成jar包
  4. java内部类 缺点_Java中的内部类及其优势
  5. EOSIO 转帐详解
  6. 区块链中的智能合约是什么?
  7. c语言输入函数有什么作用,c语言的输入函数有哪些
  8. UI设计APP图标设计规范介绍
  9. bat 将war文件转换成ear文件
  10. ant design pro (八)构建和发布