【代码笔记】手势解锁

动画实现解锁-文件目录

【代码笔记】手势解锁_第1张图片


效果图




 

 
 
ViewController.h文件
//创建自定义的View,遵守协议,设置代理,实现代理方法
 1 #import "LYPaintView.h"
 2 
 3 #import "ViewController.h"
 4 
 5 @interface ViewController ()<LYPaintViewDelegate>
 6 
 7 @end
 8 
 9 @implementation ViewController
10 
11 - (void)viewDidLoad {
12     [super viewDidLoad];
13     self.view.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"bg"]];
14     //加载子定的View
15     LYPaintView *paintView=[LYPaintView paintView];
16     //设置代理
17     paintView.delegate=self;
18     
19     paintView.center =self.view.center;
20     //添加View
21     [self.view addSubview:paintView];
22 }
23 //修改状态栏的状态
24 -(UIStatusBarStyle)preferredStatusBarStyle{
25     return UIStatusBarStyleLightContent;
26 }
27 //实现代理方法
28 -(BOOL)checkPwd:(LYPaintView *)paintView withPwd:(NSString *)pawd{
29     if ([pawd isEqualToString:@"345"]) {
30         return YES;
31     }
32     return NO;
33 }
34 @end
LYPaintView.h
//文件内容,主要是创建协议,设置代理属性
 1 #import <UIKit/UIKit.h>
 2 @class LYPaintView;
 3 //创建协议
 4 @protocol LYPaintViewDelegate <NSObject>
 5 //协议的方法
 6 -(BOOL)checkPwd:(LYPaintView *)paintView withPwd:(NSString *)pawd;
 7 
 8 @end
 9 
10 @interface LYPaintView : UIView
11 +(instancetype)paintView;
12 @property(nonatomic,weak)id <LYPaintViewDelegate>delegate;
13 @end
LYPaintView.m

//实现解锁

#import "LYPaintView.h"
#define CZLineColor [UIColor colorWithRed:0.0 green:170/255.0 blue:255/255.0 alpha:0.5]

@interface LYPaintView ()
@property(nonatomic,strong)NSMutableArray *btnsArray;

@property(nonatomic,strong)UIColor *lineColor;

@property(nonatomic,assign)CGPoint currentPoint;

@end

@implementation LYPaintView
//快速创建对象类方法
+(instancetype)paintView{
    return [[[NSBundle mainBundle]loadNibNamed:@"LYPaintView" owner:nil options:nil]lastObject];
    
}


//开始触摸事件
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    //获取触摸点
    UITouch *touch=touches.anyObject;
    CGPoint point=[touch locationInView:self];
    //遍历按钮看触摸点是否在按钮上
    [self.subviews enumerateObjectsUsingBlock:^(__kindof UIButton * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        
        BOOL isContain=CGRectContainsPoint(obj.frame, point);
        if (isContain && obj.highlighted==NO) {
            obj.highlighted=YES;
            [self.btnsArray addObject:obj];
        }else{
            obj.highlighted =NO;
        }
        
    }];
    
}
//触摸移动时
-(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    //获取当前的触摸点
    UITouch *touch=touches.anyObject;
    CGPoint point=[touch locationInView:self];
    //设置当前点
    self.currentPoint=point;
    //遍历按钮看触摸点是否在按钮上
    [self.subviews enumerateObjectsUsingBlock:^(__kindof UIButton * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        
        BOOL isContain=CGRectContainsPoint(obj.frame, point);
        if (isContain && obj.highlighted==NO) {
            obj.highlighted=YES;
            [self.btnsArray addObject:obj];
            
        }
    }];
    //重绘
    [self setNeedsDisplay];
}
//触摸结束时
-(void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    //消除最后的线
   UIButton *lastBtn = self.btnsArray.lastObject;
    self.currentPoint=lastBtn.center;
    [self setNeedsDisplay];
    //遍历触摸过的按钮获得输入的密码
    NSMutableString *password=[NSMutableString string];
    [self.btnsArray enumerateObjectsUsingBlock:^(UIButton *  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSInteger tag=obj.tag;
        [password appendFormat:@"%@",@(tag)];
    }];
    BOOL isTrue;
    //代理实现判断密码是否一致
    if ([self.delegate respondsToSelector:@selector(checkPwd:withPwd:)]) {
       isTrue = [self.delegate checkPwd:self withPwd:password];
    }
    if (isTrue) {
        NSLog(@"密码正确");
        //密码正确时恢复按钮的状态
        [self.btnsArray enumerateObjectsUsingBlock:^(UIButton *  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            obj.highlighted=NO;
            
        }];
        [self.btnsArray removeAllObjects];
        [self setNeedsDisplay];
        
    }else{
        NSLog(@"密码错误");
         //密码错误时线变为红色
        self.userInteractionEnabled=NO;
        [self.btnsArray enumerateObjectsUsingBlock:^(UIButton *  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            obj.highlighted=NO;
            obj.enabled=NO;
        }];
        self.lineColor=[UIColor redColor];
        [self setNeedsDisplay];
        //延迟1秒恢复按钮的原来状态
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            
            [self.btnsArray enumerateObjectsUsingBlock:^(UIButton *  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
                obj.enabled=YES;
            }];
            [self.btnsArray removeAllObjects];
            [self setNeedsDisplay];
            self.userInteractionEnabled=YES;
            self.lineColor=CZLineColor;
        });
        
       
        
    }
    
}
//加载按钮
-(void)awakeFromNib{
    self.lineColor=CZLineColor;
    
    for (int i=0; i<9; i++) {
        //创建按钮并添加
        UIButton *btn=[[UIButton alloc]init];
        btn.tag=i;
        btn.userInteractionEnabled = NO;
        
        [btn setBackgroundImage:[UIImage imageNamed:@"gesture_node_normal"] forState:UIControlStateNormal];
        [btn setBackgroundImage:[UIImage imageNamed:@"gesture_node_highlighted"] forState:UIControlStateHighlighted];
        [btn setBackgroundImage:[UIImage imageNamed:@"gesture_node_error"] forState:UIControlStateDisabled];
        
        [self addSubview:btn];
    }
    
}
//设置按钮的frame
-(void)layoutSubviews{
    [super layoutSubviews];
    int conNum=3;
    CGFloat btnW=70;
    CGFloat btnH=70;
    CGFloat magin=(self.frame.size.width - conNum *btnW)/(conNum -1);
    
    [self.subviews enumerateObjectsUsingBlock:^(__kindof UIButton * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSInteger col=idx % conNum;
        NSInteger row=idx / conNum;
        CGFloat btnX=col *(magin + btnW);
        CGFloat btnY=row *(magin + btnH);
        
        obj.frame=CGRectMake(btnX, btnY, btnW, btnH);

    }];
    
}
//drawRect方法绘制线条
- (void)drawRect:(CGRect)rect {
    //如果数组内没有元素就不要绘制了
    if (self.btnsArray.count==0) {
        return ;
    }
    
    //创建路径
    UIBezierPath *path=[UIBezierPath bezierPath];
    [self.btnsArray enumerateObjectsUsingBlock:^(UIButton *  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        if (idx==0) {
            [path  moveToPoint:obj.center];
        }else{
            [path addLineToPoint:obj.center];
        }
    }];
    //添加最后的线段
    [path addLineToPoint:self.currentPoint];

    [self.lineColor setStroke];
    [path setLineWidth:10];
    [path setLineCapStyle:kCGLineCapRound];
    [path setLineJoinStyle:kCGLineJoinRound];
    //渲染
    [path stroke];
    
}
//懒加载按钮数组
-(NSMutableArray *)btnsArray{
    if (_btnsArray==nil) {
        _btnsArray=[NSMutableArray array];
    }
    return _btnsArray;
}



@end

 

你可能感兴趣的:(【代码笔记】手势解锁)