你的位置:首页 > 操作系统

[操作系统](转 部分修改) 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