zoukankan      html  css  js  c++  java
  • IOS 学习笔记 2015-04-15 手势密码(原)

    //
    //  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
     
  • 相关阅读:
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
  • 原文地址:https://www.cnblogs.com/ak23173969/p/4428401.html
Copyright © 2011-2022 走看看