源码0306-手势解锁
现搭建页面
// 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-手势解锁相关推荐
- android九宫格密码源码,Android九宫格解锁的实现
主要代码如下 xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_par ...
- 精尽 Redisson 源码分析 —— 可重入分布式锁 ReentrantLock
1. 概述 在 Redisson 中,提供了 8 种分布锁的实现,具体我们可以在 <Redisson 文档 -- 分布式锁和同步器> 中看到.绝大数情况下,我们使用可重入锁(Reentra ...
- [源码]Android安卓应用手势锁图案解锁的实现
交互细节 用户首先使用账号/密码进行登录. 登录成功后,判断是否是第一次登录使用,如果是第一次则显示创建手势密码的界面,要求用户创建手势锁. 创建的过程中要求用户连接至少四个点,并且绘制两次以确认绘制 ...
- android手势密码源码,Android自定义UI手势密码改进版源码下载
在之前文章的铺垫下,再为大家分享一篇:Android手势密码,附源码下载,不要错过. 先看第一张图片的布局文件 activity_main.xml xmlns:tools="http://s ...
- Android图案密码,手势锁源码解析
Android图案密码解锁源码解析 Android Lock Pattern 源码解析 1. 介绍 1.1 关于 Android 的图案密码解锁,通过手势连接 3 * 3 的点矩阵绘制图案表示解 ...
- ios开发学习-手势交互(Gesture)效果源码分享
qianqianlianmeng ios开发学习-手势交互(Gesture)效果源码分享 All Around Pull View 介绍:实现视图四个方向(上下左右)都能够拖动更新(pull to r ...
- 带手势划动功能的日历源码
2019独角兽企业重金招聘Python工程师标准>>> 带手势划动功能的日历源码 转载:http://www.adobex.com/android/source/details/00 ...
- 缩放手势 ScaleGestureDetector 源码解析,这一篇就够了
其实在我们日常的编程中,对于缩放手势的使用并不是很经常,这一手势主要是用在图片浏览方面,比如下方例子.但是(敲重点),作为 Android 入门的基础来说,学习 ScaleGestureDetecto ...
- Unity+SenseAR教程 | 用手势发射爱心2:加入发射方向【源码】
摘要:Unity+SenseAR2.3开发的AR应用,基于手势识别同时计算手势方向,发射你的爱心~ 洪流学堂,让你快人几步.你好,我是你的技术探路者郑洪智,你可以叫我大智. 这篇教程是为了填上一篇教程 ...
最新文章
- php insert failed,较大的MySQL INSERT语句导致PHP错误
- 9 个重量级的云计算(PaaS)平台
- Stanford机器学习笔记-4. 神经网络Neural Networks (part one)
- Nginx的upstream_response_time
- Redis内存使用优化与存储
- 宣布JavaScript 2017状况调查
- android主流技术框架,android开发现在流行什么IDE和开发框架?
- D3.js、echar.js 前端必备大数据技能
- 郑大中科院合作计算机系,郑大一本今年在河南招4320人 本科新增5个专业
- 界面控件包Essential Studio for Windows Forms 2017 v3发布丨附下载
- 什么是原子性,什么是原子性操作?
- android 系统相册调用,各版本的区别总结
- 前端实现PDF文件下载的两种方式
- 闪灵CMS插件自动采集文章主动推送给搜索引擎
- List异常报错:list All elements are null
- TQ2440开发板学习纪实(4)--- 初始化片外RAM,让程序有更大内存空间
- [爬虫]requests+正则表达式爬取猫眼电影TOP100
- 为什么要从 Windows 7 升级到 Windows 10?
- 鲜为人知 的 人名典故
- 关闭msmpeng_你知道吗?把电脑系统里的这些进程关闭掉,可以提升系统流畅