zoukankan      html  css  js  c++  java
  • (转 部分修改) 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
     
  • 相关阅读:
    LeetCode 1245. Tree Diameter
    LeetCode 1152. Analyze User Website Visit Pattern
    LeetCode 1223. Dice Roll Simulation
    LeetCode 912. Sort an Array
    LeetCode 993. Cousins in Binary Tree
    LeetCode 1047. Remove All Adjacent Duplicates In String
    LeetCode 390. Elimination Game
    LeetCode 1209. Remove All Adjacent Duplicates in String II
    LeetCode 797. All Paths From Source to Target
    LeetCode 1029. Two City Scheduling
  • 原文地址:https://www.cnblogs.com/ak23173969/p/4401774.html
Copyright © 2011-2022 走看看