手势密码源码

//
//  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=1; index<=9; 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=0; index<self.allButtonsArray.count; index++) {
        CGFloat inverst_top = KSCREEN_HEIGHT/4;
        inverst_top=0;
        UIButton *btn =(UIButton *) self.allButtonsArray[index];
        //NSLog(@"%i",btn.tag);
        //获取行号
        CGFloat row = index/3;
        //获取坐标号
        CGFloat loc = index%3;
        // 按钮长跟宽
        CGFloat  btnHeight = 75;
        CGFloat  btnWith=btnHeight;
        //获取按钮间隔距离
        CGFloat inverst = (KSCREEN_WIDTH-btnHeight*3)/4;
        //X Y 坐标
        CGFloat btnX = inverst +loc*(btnWith+inverst);
        CGFloat btnY = inverst + row*(btnHeight+inverst);
        btn.frame=CGRectMake(btnX, btnY+inverst_top-15, 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 =0;
    //绘图(线段)
    for (UIButton *btn in self.stringArrays) {
        if (0==i) {
            //设置起点(注意连接的是中点)
            CGContextMoveToPoint(context, btn.center.x, btn.center.y);
        }else{
            CGContextAddLineToPoint(context, btn.center.x, btn.center.y);
        }
        i++;
    }
    //当所有按钮的中点都连接好之后,再连接手指当前的位置
    //判断数组中是否有按钮,只有有按钮的时候才绘制
    if (self.stringArrays.count !=0) {
        //画直线
        CGContextAddLineToPoint(context, self.currentPoint.x, self.currentPoint.y);
    }
    //渲染
    //设置线条的宽度
    CGContextSetLineWidth(context, 10);
    //设置图像上下文中的接接线的样式。
    CGContextSetLineJoin(context, kCGLineJoinRound);
    //设置线条终点形状
    CGContextSetLineCap(context, kCGLineCapRound);
    //画笔颜色设置
    CGContextSetRGBStrokeColor(context, 255/255.0, 100/255.0, 0/255.0, 1);
    //开始绘制图片
    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==0) {
            if ([self.spDelegate respondsToSelector:@selector(setFirstPasswordSuccess:)]) {
                [self.spDelegate setFirstPasswordSuccess:result];
            }
        }
        //NSLog(@"%i",temp_signpaw);

        if (temp_signpaw!=0&&temp_signpaw==[result integerValue]) {
            //正确跳转
            if ([self.spDelegate respondsToSelector:@selector(setPawSuccess:)]) {
                [self.spDelegate setPawSuccess:result];
            }
        }else if(temp_signpaw!=0&&temp_signpaw!=[result integerValue]){
            //错误处理
            if([self.spDelegate respondsToSelector:@selector(setTwoPasswordError)]){
                [self.spDelegate setTwoPasswordError];
            }
        }
    }else{
#pragma mark -已设置密码了
        NSInteger status = [userDefaults integerForKey:@"status"];
        if (status==-1) {
            //调试状态
            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==1) {
                   NSInteger tempUpdate_signpaw = [userDefaults integerForKey:@"tempUpdate_signpaw"];
                    if (tempUpdate_signpaw==0) {
                        if ([self.spDelegate respondsToSelector:@selector(updateSPFirst:)]) {
                            [self.spDelegate updateSPFirst:result];
                        }
                    }
                    if(tempUpdate_signpaw!=0){
                        if ([self.spDelegate respondsToSelector:@selector(updateSPConfirm:)]) {
                            [self.spDelegate updateSPConfirm:result];
                        }
                    }
                }
                if(updateStatus!=1){
                    //判断是否为已成功输入手势密码
                    if ([self.spDelegate respondsToSelector:@selector(setSuccessAfterFirstPS:)]) {
                        [self.spDelegate setSuccessAfterFirstPS:result];
                    }
                }
            }
        }
    }
}

@end
时间: 2024-10-27 13:16:17

手势密码源码的相关文章

仿映客客户端、TableView多种动画效果、边缘返回手势等源码

iOS精选源码 相册多选框架 zhPopupController 简单快捷弹出自定义视图 tableView实现多种动画效果 自定义动画的PageControl 展示tableView和collectionView的结构,框架CHD_ListView_Structure RxSwift+Moya+ObjectMapper优雅的网络请求级模型转换 多种指示器文字效果源码SGPagingView react-native低仿映客直播客户端 支持iOS/Android ScreenEdgePanGes

iOS火焰动画效果、图文混排框架、StackView效果、偏好设置、底部手势等源码

iOS精选源码 高性能图文混排框架,构架顺滑的iOS应用. 使用OpenGLE覆盖阿尔法通道视频动画播放器视图. 可选最大日期截至当日日期的日期轮选器ChooseDatePicker 简单轻量的图片浏览器YCPhotoBrower 使用偏好设置.属性列表.归档解档保存数据.恢复数据 页面底部手势交互滚动UITableView 使用CoreAnimation来模拟iOS中的StackView. 盒子可以更具长宽高变化的动画 iOS优质博客 iOS导航栏使用总结 目录:一.设置导航栏样式二.自定义导

(素材源码)猫猫学IOS(三十五)UI之Quartz2D仿真支付宝手势解锁_代理获得密码。

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents 源码:http://download.csdn.net/detail/u013357243/8669765 效果: 代码: NYLockView.h // // NYLockView.h // 手势解锁 // // Created by apple on 15-5-6. // Copyright (c) 2015年 znyca

Android例子源码仿支付宝手势密码的功能实现

本项目是一个仿支付宝手势密码部分的源码,项目在1280×720分辨率上显示有问题,在 854x480上没有问题,项目编码UTF-8默认编译版本4.4.2,实现思路: 1.要用一个类来表示这9个点中的第一个点.里面保留有当前点的上下左右的各个位置等属性: 2.自定义GroupView,用来装9个点,9个点的显示是通过ImageView.复写onLayout这个方法,让点按需求排列: 3.定义一个可以画线的View,复写onTouchEvent方法,在这个方法里面进行画直线的操作: 4.判断用户手指

Android应用源码带定位和密码找回的锁屏项目

Android应用源码带定位和密码找回的锁屏项目 首先这是个锁屏的应用项目源码,并且有录制手势的功能不过与传统的九宫格不一样,即使源码里面有注释但是至今我也没有弄明白他的手势录制方法, 项目里面貌似还用到了GPS和五次解锁失败就会向指定手机号发送短信,不过我没有细看,源码有比较详细的注释,正在研究锁屏的朋友不要错过,本项目默认编译版本4.4.2编码GBK. 下载地址:http://www.devstore.cn/code/info/173.html    

Android例子源码仿支付宝手势密码的功能实

本项目是一个仿支付宝手势密码部分的源码,项目在1280×720分辨率上显示有问题,在 854x480上没有问题,项目编码UTF-8默认编译版本4.4.2,实现思路: 1.要用一个类来表示这9个点中的第一个点.里面保留有当前点的上下左右的各个位置等属性: 2.自定义GroupView,用来装9个点,9个点的显示是通过ImageView.复写onLayout这个方法,让点按需求排列: 3.定义一个可以画线的View,复写onTouchEvent方法,在这个方法里面进行画直线的操作: 4.判断用户手指

Android手势源码浅析-----手势绘制(GestureOverlayView)

Android手势源码浅析-----手势绘制(GestureOverlayView)

CentOS6.7 Mysql5.6.35版本 源码编译+Mysql数据库忘记root密码如何修改

源码编译MySQL [[email protected] ~]# yum install cmake nucrses-devel –y      //安装编译环境及终端操作的开发包 -- Installed: cmake.x86_64 0:2.8.12.2-4.el6 Dependency Installed: libarchive.x86_64 0:2.8.3-7.el6_8 Complete! 下载软件包 [[email protected] ~]# wget http://ftp.ntu.

Android跟踪球-手势移动图片-自定义控件(附源码)

由于我不会制作动画图片,所以先放几及其不具备代表性的展示图片. 我以前的思路是通过动态的设置xy坐标通过手势移动来识别,但是我后来试了一下,发现运行效果极差.所以偷闲做了下这个跟踪球控件,其实实现十分简单.只要大家熟悉自定义控件的使用以及手势识别.基本上就ok了. 现在我们看下这个控件的源码TouchMoveView.java package com.fay.touchmove; import android.annotation.SuppressLint; import android.con