(转 部分修改) IOS 手势密码(简单版)

//

//  Created by wangtouwang on 15/4/7.

//  Copyright (c) 2015年 wangtouwang. All rights reserved.

//



#import <UIKit/UIKit.h>





@class YYLockView;

@protocol YYLockViewDelegate <NSObject>

//自定义一个协议

 //协议方法,把当前视图作为参数

 -(void)LockViewDidClick:(YYLockView *)lockView andPwd:(NSString *)pwd;

@end





@interface YYLockView : UIView



//代理

@property(nonatomic,weak) IBOutlet id<YYLockViewDelegate>delegate;





@end

 

//

//  YYLockView.m

//  Created by wangtouwang on 15/4/7.

//  Copyright (c) 2015年 wangtouwang. All rights reserved.

//



#import "YYLockView.h"

// 设置获取屏幕长宽全局变量

#define KSCREEN_WIDTH [UIScreen mainScreen].bounds.size.width

#define KSCREEN_HEIGHT [UIScreen mainScreen].bounds.size.height

#define BUTTON_HEIGHT_MIDDLE_WIDTH_RADIO 1.22





@interface YYLockView ()

{

    UIView *newView;

}

@property(nonatomic,strong)NSMutableArray *buttons;

@property(nonatomic,strong)NSMutableArray *includButtons;



//定义一个属性,记录当前点

@property(nonatomic,assign)CGPoint currentPoint;



@end



@implementation YYLockView





#pragma mark-懒加载

-(NSMutableArray *)buttons

{

    if (_buttons==nil) {

        _buttons=[NSMutableArray array];

    }

    return _buttons;

}



#pragma mark-懒加载

-(NSMutableArray *)includButtons

{

    if (_includButtons==nil) {

        _includButtons=[NSMutableArray array];

    }

    return _includButtons;

}





-(id)initWithCoder:(NSCoder *)aDecoder

{

    NSLog(@"断点 B 号 ");

    if (self=[super initWithCoder:aDecoder]) {

        [self setup];

    }

    return self;

}



//界面搭建

- (id)initWithFrame:(CGRect)frame

{

    NSLog(@"断点  1 号 ");

    self = [super initWithFrame:frame];

    if (self) {

        [self setup];

    }

    return self;

}





//在界面上创建9个按钮

-(void)setup

{

//    NSLog(@"断点 2 号 ");

//    newView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];

//    newView.backgroundColor=[UIColor redColor];

//    [self addSubview:newView];

    //1.创建9个按钮

    for (int i=0; i<9; i++) {

        UIButton *btn=[UIButton buttonWithType:UIButtonTypeCustom];

        //2.设置按钮的状态背景

        [btn setBackgroundImage:[UIImage imageNamed:@"gesture_node_normal"] forState:UIControlStateNormal];

        [btn setBackgroundImage:[UIImage imageNamed:@"gesture_node_highlighted"] forState:UIControlStateSelected];

        //3.把按钮添加到视图中

        [self  addSubview:btn];

        //将按钮添加到包含按钮数组中

        [[self includButtons] addObject:btn];

        //4.禁止按钮的点击事件

        btn.userInteractionEnabled=NO;

        //5.设置每个按钮的tag

        btn.tag=i+1;

    }

}



//4.设置按钮的frame

-(void)layoutSubviews

{

    NSLog(@"断点顺序 3 号 ");

    CGFloat inverst = KSCREEN_HEIGHT/4.5;

    inverst=0;

    //4.1需要先调用父类的方法

    [super layoutSubviews];

    

    for (int i=0; i<[self includButtons].count; i++) {

        //4.2取出按钮

        UIButton *btn=[self includButtons][i];

        //4.3九宫格法计算每个按钮的frame

        CGFloat row = i/3;

        CGFloat loc   = i%3;

//        NSLog(@"ROW=%f LOC=%f",row,loc);

        CGFloat btnW=74;

        CGFloat btnH=74;

        CGFloat padding=(self.frame.size.width-3*btnW)/4;

        CGFloat btnX=padding+(btnW+padding)*loc;

        CGFloat btnY=padding*BUTTON_HEIGHT_MIDDLE_WIDTH_RADIO+(btnW+padding)*row;

//        NSLog(@"BTNX-%f BTNY=%f ",btnX,btnY);

        btn.frame=CGRectMake(btnX, btnY+inverst, btnW, btnH);

    }

}



//重写drawrect:方法

-(void)drawRect:(CGRect)rect

{

    NSLog(@"断点顺序 4 号 ");

    

    //获取上下文

    CGContextRef ctx=UIGraphicsGetCurrentContext();



    //在每次绘制前,清空上下文

    CGContextClearRect(ctx, rect);

    

    //填充画布颜色

    [[self renderImageWithColor:[UIColor grayColor] inSize:CGSizeMake(KSCREEN_WIDTH, KSCREEN_HEIGHT)] drawInRect:CGRectMake(0, 0, KSCREEN_WIDTH, KSCREEN_HEIGHT)];//在坐标中画出图片

    

    

    //绘图(线段)

    for (int i=0; i<self.buttons.count; i++) {

        UIButton *btn=self.buttons[i];

        if (0==i) {

            //设置起点(注意连接的是中点)

            //            CGContextMoveToPoint(ctx, btn.frame.origin.x, btn.frame.origin.y);

            CGContextMoveToPoint(ctx, btn.center.x, btn.center.y);

        }else

        {

            //            CGContextAddLineToPoint(ctx, btn.frame.origin.x, btn.frame.origin.y);

            CGContextAddLineToPoint(ctx, btn.center.x, btn.center.y);

        }

    }

    

    //当所有按钮的中点都连接好之后,再连接手指当前的位置

    //判断数组中是否有按钮,只有有按钮的时候才绘制

    if (self.buttons.count !=0) {

        CGContextAddLineToPoint(ctx, self.currentPoint.x, self.currentPoint.y);

    }

    

    //渲染

    //设置线条的属性

    CGContextSetLineWidth(ctx, 10);

    CGContextSetLineJoin(ctx, kCGLineJoinRound);

    CGContextSetLineCap(ctx, kCGLineCapRound);

    CGContextSetRGBStrokeColor(ctx, 255/255.0, 0/255.0, 0/255.0, 1);

    

    CGContextStrokePath(ctx);

    

   

    

}



//填充画布颜色

- (UIImage *)renderImageWithColor:(UIColor *)color inSize:(CGSize)size

{

    CGRect rect = CGRectMake(0.0f, 0.0f, size.width, size.height);

    UIGraphicsBeginImageContext(rect.size);

    CGContextRef context = UIGraphicsGetCurrentContext();

    

    CGContextSetFillColorWithColor(context, [color CGColor]);

    CGContextFillRect(context, rect);

    

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    

    return image;

}





//5.监听手指的移动

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

    NSLog(@"断点 E 号 ");

    CGPoint starPoint=[self getCurrentPoint:touches];

    UIButton *btn=[self getCurrentBtnWithPoint:starPoint];

    

    if (btn && btn.selected != YES) {

        btn.selected=YES;

        [self.buttons addObject:btn];

    }

    //    [self setNeedsDisplay];

}



-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

{

    NSLog(@"断点 F 号 ");

    CGPoint movePoint=[self getCurrentPoint:touches];

    UIButton *btn=[self getCurrentBtnWithPoint:movePoint];

    //存储按钮

    //已经连过的按钮,不可再连

    if (btn && btn.selected != YES) {

        //设置按钮的选中状态

        btn.selected=YES;

        //把按钮添加到数组中

        [self.buttons addObject:btn];

    }

    //记录当前点(不在按钮的范围内)

    self.currentPoint=movePoint;

    //通知view重新绘制

    [self setNeedsDisplay];

}



//手指离开的时候清除线条

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

{

    NSLog(@"断点 G 号 ");

    //取出用户输入的密码

    //创建一个可变的字符串,用来保存用户密码

    NSMutableString *result=[NSMutableString string];

    for (UIButton *btn in self.buttons) {

        [result appendFormat:@"%lu",btn.tag];

    }

    NSLog(@"用户输入的密码为:%@",result);

    //通知代理,告知用户输入的密码

    if ([self.delegate respondsToSelector:@selector(LockViewDidClick:andPwd:)]) {

        [self.delegate LockViewDidClick:self andPwd:result];

    }

    

    //重置按钮的状态

    //    for (UIButton *btn in self.buttons) {

    //        btn.selected=NO;

    ////        [btn setSelected:NO];

    //    }

    

    //调用该方法,它就会让数组中的每一个元素都调用setSelected:方法,并给每一个元素传递一个NO参数

    [self.buttons makeObjectsPerformSelector:@selector(setSelected:) withObject:@(NO)];

    //清空数组

    [self.buttons removeAllObjects];

    [self setNeedsDisplay];

    

    //清空当前点

    self.currentPoint=CGPointZero;

}



//对功能点进行封装

-(CGPoint)getCurrentPoint:(NSSet *)touches

{

    NSLog(@"断点 H 号 ");

    UITouch *touch=[touches anyObject];

    CGPoint point=[touch locationInView:touch.view];

    return point;

}

-(UIButton *)getCurrentBtnWithPoint:(CGPoint)point

{

    NSLog(@"断点 J 号 ");

    for (int i=0;i<_includButtons.count;i++) {

        UIButton *btn =_includButtons[i];

        if (CGRectContainsPoint(btn.frame, point)) {

            return btn;

        }

    }

    return Nil;

}





@end

 

 

你可能感兴趣的:(ios)