//
// WPSignPasswordView.h
// 网投网
//
// Created by wangtouwang on 15/4/9.
// Copyright (c) 2015年 wangtouwang. All rights reserved.
// #import <UIKit/UIKit.h> @class WPSignPasswordView;
@protocol WPSignPasswordDelegate <NSObject> //设置密码 确认成功
@required
-(void)setPawSuccess:(NSString *)password;
//设置第一次临时密码成功
@required
-(void)setFirstPasswordSuccess:(NSString *)password;
//第二次输入确认密码错误
-(void)setTwoPasswordError;
//修改手势密码 请输入之前的密码
-(void)setSuccessAfterFirstPS:(NSString *)password;
//进入程序后输入手势密码判断是否正确
-(void)confirmPassword:(NSString *)password;
//手势密码进入修改状态(即原密码输入成功) 首次输入
-(void)updateSPFirst:(NSString *)password;
//手势密码进入修改状态(即原密码输入成功) 二次输入,相当于输入密码确认
-(void)updateSPConfirm:(NSString *)password; @end #pragma mark 手势密码View
@interface WPSignPasswordView : UIView //设置代理
@property(nonatomic,strong) id<WPSignPasswordDelegate> spDelegate; @end
//
// WPSignPasswordView.m
// 网投网
//
// Created by wangtouwang on 15/4/9.
// Copyright (c) 2015年 wangtouwang. All rights reserved.
// #import "WPSignPasswordView.h" //屏幕的长宽
#define KSCREEN_WIDTH [UIScreen mainScreen].bounds.size.width
#define KSCREEN_HEIGHT [UIScreen mainScreen].bounds.size.height @interface WPSignPasswordView()
{ } @property(nonatomic,strong) NSMutableArray *stringArrays;
@property(nonatomic,strong) NSMutableArray *allButtonsArray;
//定义一个属性,记录当前点
@property(nonatomic,assign)CGPoint currentPoint; @end @implementation WPSignPasswordView #pragma mark 实例化收集字符串的数组 并且用懒加载
-(NSMutableArray *)getStringArrays{
if (self.stringArrays==nil) {
self.stringArrays = [NSMutableArray array];
}
return self.stringArrays;
} #pragma mark 实例化包含所有密码按钮的数组 并且用懒加载
-(NSMutableArray *)getAllButtonsArray{
if (self.allButtonsArray==nil) {
self.allButtonsArray = [NSMutableArray array];
}
return self.allButtonsArray;
} #pragma mark 复写初始化界面函数 initFrame
-(instancetype)initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
if (self) {
[self setup];
}
return self;
} #pragma mark 界面布局
-(void)setup{
//NSLog(@"初始化界面布局执行的");
for (int index=; index<=; index++) {
//创建按钮
UIButton *numberButton = [[UIButton alloc] init];
//设置按钮的背景图片,并且设置是在何种状态下
[numberButton setBackgroundImage:[UIImage imageNamed:@"gesture_node_normal"] forState:UIControlStateNormal];
[numberButton setBackgroundImage:[UIImage imageNamed:@"gesture_node_highlighted"] forState:UIControlStateSelected];
//将按钮添加到视图中
[self addSubview:numberButton];
//将按钮存储到按钮数组中
[[self getAllButtonsArray] addObject:numberButton];
//禁止按钮点击事件
numberButton.userInteractionEnabled=NO;
//设置按钮标志值
numberButton.tag=index; }
} #pragma mark 看看何时触发
-(void)layoutSubviews{
//需要先调用父类的方法
[super layoutSubviews];
//设置按钮位置
for (int index=; index<self.allButtonsArray.count; index++) {
CGFloat inverst_top = KSCREEN_HEIGHT/;
inverst_top=;
UIButton *btn =(UIButton *) self.allButtonsArray[index];
//NSLog(@"%i",btn.tag);
//获取行号
CGFloat row = index/;
//获取坐标号
CGFloat loc = index%;
// 按钮长跟宽
CGFloat btnHeight = ;
CGFloat btnWith=btnHeight;
//获取按钮间隔距离
CGFloat inverst = (KSCREEN_WIDTH-btnHeight*)/;
//X Y 坐标
CGFloat btnX = inverst +loc*(btnWith+inverst);
CGFloat btnY = inverst + row*(btnHeight+inverst);
btn.frame=CGRectMake(btnX, btnY+inverst_top-, btnHeight, btnHeight);
}
} #pragma mark 复写画布布局
- (void)drawRect:(CGRect)rect {
//NSLog(@"再次触发吗");
//获取上下文
CGContextRef context = UIGraphicsGetCurrentContext();
#pragma mark 填充画布颜色
//填充上下文颜色
CGContextSetFillColorWithColor(context, [[UIColor grayColor] CGColor]);
//补充当前填充颜色的rect
CGContextFillRect(context, rect);
#pragma mark -实现画线功能
int i =;
//绘图(线段)
for (UIButton *btn in self.stringArrays) {
if (==i) {
//设置起点(注意连接的是中点)
CGContextMoveToPoint(context, btn.center.x, btn.center.y);
}else{
CGContextAddLineToPoint(context, btn.center.x, btn.center.y);
}
i++;
}
//当所有按钮的中点都连接好之后,再连接手指当前的位置
//判断数组中是否有按钮,只有有按钮的时候才绘制
if (self.stringArrays.count !=) {
//画直线
CGContextAddLineToPoint(context, self.currentPoint.x, self.currentPoint.y);
}
//渲染
//设置线条的宽度
CGContextSetLineWidth(context, );
//设置图像上下文中的接接线的样式。
CGContextSetLineJoin(context, kCGLineJoinRound);
//设置线条终点形状
CGContextSetLineCap(context, kCGLineCapRound);
//画笔颜色设置
CGContextSetRGBStrokeColor(context, /255.0, /255.0, /255.0, );
//开始绘制图片
CGContextStrokePath(context);
} #pragma mark 复写 UIResponder--API 监听手指移动开始
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
UITouch *uitouch = [touches anyObject];
CGPoint point = [uitouch locationInView:uitouch.view];
UIButton *targetBtn = nil;
for (UIButton *btn in self.allButtonsArray ) {
if (CGRectContainsPoint(btn.frame, point)) {
targetBtn = btn;
break;
}
}
if (targetBtn&&targetBtn.selected!=YES) {
targetBtn.selected=YES;
[[self getStringArrays] addObject:targetBtn];
}
} #pragma mark 复写 UIResponder--API 监听手指移动
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
UITouch *uitouch = [touches anyObject];
CGPoint movepoint = [uitouch locationInView:uitouch.view];
UIButton *targetBtn = nil;
for (UIButton *btn in self.allButtonsArray ) {
if (CGRectContainsPoint(btn.frame, movepoint)) {
targetBtn = btn;
break;
}
}
if (targetBtn && targetBtn.selected != YES) {
//设置按钮的选中状态
targetBtn.selected=YES;
//把按钮添加到数组中
[[self getStringArrays] addObject:targetBtn];
}
//记录当前点(不在按钮的范围内)
self.currentPoint=movepoint;
//通知view重新绘制
[self setNeedsDisplay];
} #pragma mark 复写 UIResponder--API 监听手指离开屏幕
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
//取出用户输入的密码 创建一个可变的字符串,用来保存用户密码 取出用户输入的密码
NSMutableString *result=[NSMutableString string];
for (UIButton *btn in self.stringArrays) {
[result appendFormat:@"%lu",btn.tag];
}
//NSLog(@"用户输入的密码为:%@",result);`
//清空连线记录
[self.stringArrays makeObjectsPerformSelector:@selector(setSelected:) withObject:@(NO)];
//清空数组
[self.stringArrays removeAllObjects];
[self setNeedsDisplay];
//清空当前点
self.currentPoint=CGPointZero; //获取NSUserDefaults对象,判断该对象中是否已存在手势密码
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
BOOL flag = [userDefaults boolForKey:@"flag"];
NSInteger temp_signpaw = [userDefaults integerForKey:@"temp_signpaw"];
if (!flag) {
#pragma mark -还未设置密码
//记录临时密码
if (temp_signpaw==) {
if ([self.spDelegate respondsToSelector:@selector(setFirstPasswordSuccess:)]) {
[self.spDelegate setFirstPasswordSuccess:result];
}
}
//NSLog(@"%i",temp_signpaw); if (temp_signpaw!=&&temp_signpaw==[result integerValue]) {
//正确跳转
if ([self.spDelegate respondsToSelector:@selector(setPawSuccess:)]) {
[self.spDelegate setPawSuccess:result];
}
}else if(temp_signpaw!=&&temp_signpaw!=[result integerValue]){
//错误处理
if([self.spDelegate respondsToSelector:@selector(setTwoPasswordError)]){
[self.spDelegate setTwoPasswordError];
}
}
}else{
#pragma mark -已设置密码了
NSInteger status = [userDefaults integerForKey:@"status"];
if (status==-) {
//调试状态
NSLog(@"调试状态");
}else{
//正常状态
//判断是从那个窗口跳转过来的
NSString *page = [userDefaults objectForKey:@"turnPage"];
if ([page isEqualToString:@"mainPage"]) {
if ([self.spDelegate respondsToSelector:@selector(confirmPassword:)]) {
[self.spDelegate confirmPassword:result];
}
}else{
NSInteger updateStatus = [userDefaults integerForKey:@"updateStatus"];
if (updateStatus==) {
NSInteger tempUpdate_signpaw = [userDefaults integerForKey:@"tempUpdate_signpaw"];
if (tempUpdate_signpaw==) {
if ([self.spDelegate respondsToSelector:@selector(updateSPFirst:)]) {
[self.spDelegate updateSPFirst:result];
}
}
if(tempUpdate_signpaw!=){
if ([self.spDelegate respondsToSelector:@selector(updateSPConfirm:)]) {
[self.spDelegate updateSPConfirm:result];
}
}
}
if(updateStatus!=){
//判断是否为已成功输入手势密码
if ([self.spDelegate respondsToSelector:@selector(setSuccessAfterFirstPS:)]) {
[self.spDelegate setSuccessAfterFirstPS:result];
}
}
}
}
}
} @end
 

IOS 学习笔记 2015-04-15 手势密码(原)的更多相关文章

  1. iOS学习笔记——触控与手势

    触控 此部分内容已学良久,恨记之甚晚,忙矣,懒矣!本文简而记焉,恐日后忘也. 在iOS的触控事件中,有触控.事件以及响应者这三个角色,一个触摸则代表了一只手指和屏幕接触这个动作所包含的信息:而事件则包 ...

  2. iOS学习笔记-精华整理

    iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...

  3. iOS回顾笔记(04) -- UIScrollView的基本使用详解

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  4. IOS学习笔记25—HTTP操作之ASIHTTPRequest

    IOS学习笔记25—HTTP操作之ASIHTTPRequest 分类: iOS2012-08-12 10:04 7734人阅读 评论(3) 收藏 举报 iosios5网络wrapper框架新浪微博 A ...

  5. iOS学习笔记总结整理

    来源:http://mobile.51cto.com/iphone-386851_all.htm 学习IOS开发这对于一个初学者来说,是一件非常挠头的事情.其实学习IOS开发无外乎平时的积累与总结.下 ...

  6. IOS学习笔记48--一些常见的IOS知识点+面试题

      IOS学习笔记48--一些常见的IOS知识点+面试题   1.堆和栈什么区别? 答:管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制:对于堆来说,释放工作由程序员控制,容易产生memor ...

  7. iOS学习笔记-自己动手写RESideMenu

    代码地址如下:http://www.demodashi.com/demo/11683.html 很多app都实现了类似RESideMenu的效果,RESideMenu是Github上面一个stars数 ...

  8. iOS学习笔记-自定义过渡动画

    代码地址如下:http://www.demodashi.com/demo/11678.html 这篇笔记翻译自raywenderlick网站的过渡动画的一篇文章,原文用的swift,由于考虑到swif ...

  9. Java学习笔记(04)

    Java学习笔记(04) 如有不对或不足的地方,请给出建议,谢谢! 一.对象 面向对象的核心:找合适的对象做合适的事情 面向对象的编程思想:尽可能的用计算机语言来描述现实生活中的事物 面向对象:侧重于 ...

  10. iOS学习笔记——AutoLayout的约束

    iOS学习笔记——AutoLayout约束 之前在开发iOS app时一直以为苹果的布局是绝对布局,在IB中拖拉控件运行或者直接使用代码去调整控件都会发上一些不尽人意的结果,后来发现iOS在引入了Au ...

随机推荐

  1. POJ3009 Curling 2.0

    正式做POJ的第一题,做出来后又看了别人的代码,就又完善了一下,也通过了.参考 http://blog.sina.com.cn/s/blog_4abcd9bc0100phzb.html 改了之后觉得写 ...

  2. XXX 用户 is not in the sudoers file. This incident will be reported 的问题解决方案

    说的是,这种问题,是出现在ubuntu系统里. root@SparkSingleNode:/usr/local/jdk# pwd /usr/local/jdk root@SparkSingleNode ...

  3. 教程-Delphi调用C# WEBSERVICE(二)

    第二步:将webserivce的WSDL导入到该dll工程中,如何导,方法至少有两种,我说简单的一种:  file->new->other->WebService->WSDL ...

  4. hdoj 2802 F(N)【递推 规律】

    F(N) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  5. linux 查看cpu 内存 硬盘 文件夹大小

    文件夹大小 显示cpu使用率 top 1 查看CPU 1.1 查看CPU个数 # cat /proc/cpuinfo | grep "physical id" | uniq | w ...

  6. 微信开发第8章 通过accesstoken将长连接转换为短链接

    业务场景:开发的过程中经常会有一些很长的链接,这个时候如果生成二维码,会导致扫码的过程中识别比较慢,如果存入数据库,会导致数据库的字段长度要设定的很长才行,所以把长连接转换为短链接就越来越重要了. 接 ...

  7. Node.js初级

    package.json文件字段说明 name:包名.包名是唯一的,只能包含小写字母.数字和下划线. version:包版本号. description:包说明. keywords:关键字数组.用于搜 ...

  8. get和post,session和cookie的一些说明

      1.GET和POST的区别 A. 从字面意思和HTTP的规范来看,GET用于获取资源信息而POST是用来更新资源信息. B. GET提交请求的数据实体会放在URL的后面,用?来分割,参数用& ...

  9. PHP操作SQLITE

    一直以来.我们操作SQLITE,都是基于PHP默认的SQLITE操作模块. 今天介绍一个能够操作SQLITE2,和SQLITE3的PHP类,此为我封装的. <? php abstract cla ...

  10. MySQL DBA教程:Mysql性能优化之缓存参数优化

      在平时被问及最多的问题就是关于 MySQL 数据库性能优化方面的问题,所以最近打算写一个MySQL数据库性能优化方面的系列文章,希望对初中级 MySQL DBA 以及其他对 MySQL 性能优化感 ...