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

[操作系统]【代码笔记】手势解锁


动画实现解锁-文件目录

ViewController.h文件
//创建自定义的View,遵守协议,设置代理,实现代理方法
 1 #import "LYPaintView.h" 2  3 #import "ViewController.h" 4  5 @interface ViewController ()<LYPaintViewDelegate> 6  7 @end 8  9 @implementation ViewController10 11 - (void)viewDidLoad {12   [super viewDidLoad];13   self.view.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"bg"]];14   //加载子定的View15   LYPaintView *paintView=[LYPaintView paintView];16   //设置代理17   paintView.delegate=self;18   19   paintView.center =self.view.center;20   //添加View21   [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 : UIView11 +(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