IOS开发基础之手势解锁项目案例

项目最终实现效果。
由于缺少红色的error背景图。我自己从安卓项目找到一个手势解锁,然后通过ps添加粉红色的红圈,才得以解决。为了分享给大家源码,github和本地都进行了备份。项目才100K左右。最后用到了block回调思想或者设置代理的方式。

github源码地址:https://github.com/sunjunjunsun/Gesture-unlocking.git
CSDN资源地址:
https://download.csdn.net/download/A1521315qwss/15398441
具体的实现代码:

//
//  ViewController.m
//  27-手势解锁
//
//  Created by 鲁军 on 2021/2/20.
//
#import "ViewController.h"
#import "LJView.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet LJView *passwordView;
@end
@implementation ViewController
- (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"Home_refresh_bg"]];self.passwordView.passwordBlock = ^(NSString * pwd) {if([pwd isEqualToString:@"123"]){NSLog(@"输入密码正确");return YES;}else{NSLog(@"输入密码错误");return NO;}};
}
@end
//  LJView.h
//  27-手势解锁
//  Created by 鲁军 on 2021/2/20.
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface LJView : UIView
@property(nonatomic,copy) BOOL (^passwordBlock)(NSString *);
@end
NS_ASSUME_NONNULL_END
//  LJView.m
//  27-手势解锁
//  Created by 鲁军 on 2021/2/20.
#import "LJView.h"
#define kButtonCount 9
@interface LJView ()
@property(nonatomic,strong)NSMutableArray *btns;
//所有需要连线的数组
@property(nonatomic,strong)NSMutableArray *lineBtns;
@property(nonatomic,assign)CGPoint currentPoint;
@end
@implementation LJView
//画线
- (void)drawRect:(CGRect)rect{//如果没有需要画线的按钮。那么不需要的执行drawrect 方法if(!self.lineBtns.count){return;}UIBezierPath *path = [UIBezierPath bezierPath];for(int i=0;i<self.lineBtns.count;++i){UIButton *btn =self.lineBtns[i];if(i==0){[path moveToPoint:btn.center];}else{[path addLineToPoint:btn.center];}}//连线到手指的位置[path addLineToPoint:self.currentPoint];[[UIColor whiteColor] set];[path setLineWidth:10];// 设置连接处的样式[path setLineJoinStyle:kCGLineJoinRound];//设置头尾的样式[path setLineCapStyle:kCGLineCapRound];[path stroke];
}- (NSMutableArray *)lineBtns{if(!_lineBtns){_lineBtns = [NSMutableArray array];}return _lineBtns;
}
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{//获取触摸对象UITouch *t=touches.anyObject;//获取手指的位置CGPoint p=[t locationInView:t.view];self.currentPoint = p;//获取btnfor(int i=0;i<self.btns.count;++i){UIButton *btn = self.btns[i];if(CGRectContainsPoint(btn.frame, p)){btn.selected = YES;if(![self.lineBtns containsObject:btn]){//添加到需要画线的数组当中[self.lineBtns addObject:btn];}}}//重绘[self setNeedsDisplay];
}- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{self.currentPoint = [[self.lineBtns lastObject] center];[self setNeedsDisplay];NSString *password = @"";for(int i=0;i<self.lineBtns.count;++i){UIButton *btn =self.lineBtns[i];btn.selected = NO;btn.enabled = NO;password = [password stringByAppendingFormat:[NSString stringWithFormat:@"%ld",btn.tag]];}NSLog(@"%@",password);if(self.passwordBlock){if(self.passwordBlock(password)){NSLog(@"正确");}else{NSLog(@"错误");}}[self setUserInteractionEnabled:NO];dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2*NSEC_PER_SEC)), dispatch_get_main_queue(), ^{[self setUserInteractionEnabled:YES];[self clear];});}
//清空 恢复到最初始状态
-(void)clear{for(int i=0;i<self.btns.count;++i){UIButton *btn = self.btns[i];btn.selected = NO;btn.enabled = YES;}//清空所有线[self.lineBtns removeAllObjects];[self setNeedsDisplay];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{//获取触摸对象UITouch *t=touches.anyObject;//获取手指的位置CGPoint p=[t locationInView:t.view];//获取btnfor(int i=0;i<self.btns.count;++i){UIButton *btn = self.btns[i];if(CGRectContainsPoint(btn.frame, p)){btn.selected = YES;//添加到需要画线的数组当中[self.lineBtns addObject:btn];}}
}- (NSMutableArray *)btns{if(!_btns){_btns =[NSMutableArray array];}return  _btns;
}
- (void)awakeFromNib{for(int i=0;i<kButtonCount;++i){UIButton *btn = [[UIButton alloc] init];// btn.backgroundColor = [UIColor redColor];btn.tag = i;[btn setUserInteractionEnabled:NO];[btn setBackgroundImage:[UIImage imageNamed:@"gesture_node_normal"] forState:UIControlStateNormal];[btn setBackgroundImage:[UIImage imageNamed:@"gesture_node_highlighted"] forState:UIControlStateSelected];[btn setBackgroundImage:[UIImage imageNamed:@"gesture_node_error-2"] forState:UIControlStateDisabled];[self addSubview:btn];[self.btns addObject:btn];}
}- (void)layoutSubviews{[super layoutSubviews];CGFloat w = 74;CGFloat h = w;int colCount = 3;CGFloat margin =(self.frame.size.width - 3 *w)/4;for(int i=0;i<kButtonCount;++i){CGFloat x = (i%colCount)*(margin+w)+margin;CGFloat y = (i/colCount)*(margin+w)+margin;[self.btns[i] setFrame:CGRectMake(x, y, w, h)];}
}
@end

IOS开发基础之手势解锁项目案例相关推荐

  1. IOS开发基础之摇奖机案例

    IOS开发基础之摇奖机案例 // ViewController.m // 33-摇奖机器 // Created by 鲁军 on 2021/3/9. #import "ViewControl ...

  2. IOS开发基础之汽车品牌项目-14

    IOS开发基础之汽车品牌项目-14 // // ViewController.m // 16-汽车品牌展示02 // // Created by 鲁军 on 2021/2/3. //#import & ...

  3. IOS开发基础之模拟科技头条项目案例32

    IOS开发基础之模拟科技头条项目案例32 说说这个项目的技术要点核心 ,首先是异步网络请求,block的回调,sdWebImage的使用.各个控件的使用,NSDate日期的转换.自动适配屏幕工作,模型 ...

  4. IOS开发基础之微博项目第1天-OC版

    IOS开发基础之微博项目第1天-OC版 纯代码创建的项目,具有参考价值 该资料来自2014年7月3号,虽然时间过去较长,但是oc和swift不同,oc语法迭代更新慢 具有一定的参考意义 涉及xib加载 ...

  5. IOS开发基础之大转盘案例

    IOS开发基础之大转盘案例 本案例使用xib加载的,以及核心动画的使用.动态按钮的使用和创建.等知识. 源码在我的主页资源下.欢迎下载. 核心代码在这. // LJRotateView.h // 37 ...

  6. IOS开发基础之画板案例软件的开发

    IOS开发基础之画板案例软件的开发 值此元宵佳节,我依然在学习IOS,几天没有更新博客了.今天更新了一下. 源码在我的主页里面. info.plist里面加入这样的代码,防止截图的时候有问题 < ...

  7. IOS开发基础之核心动画 基础动画、关键帧、组动画案例

    IOS开发基础之核心动画 基础动画.关键帧.组动画案例 案例源码在我的主页里.实现效果图 // // ViewController.m // 30-核心动画 // // Created by 鲁军 o ...

  8. IOS开发基础之微博项目

    IOS开发基础之微博项目 关键性代码 // // NJViewController.m // 06-预习-微博(通过代码自定义cell)// #import "NJViewControlle ...

  9. IOS开发基础之团购案例17-xib和UITableView两种方式实现

    IOS开发基础之团购案例17-xib和UITableView两种方式实现 Design By Johnson Shanghai 实现效果 系统和Xcode版本 注意的细节 关键性的代码 // // V ...

最新文章

  1. 日本上市公司提供BTC, BCH, ETH担保的贷款
  2. python基础教程:对可变对象和不可变对象的详解
  3. 求离散马尔科夫链的平稳分布+按照一定概率分布生成想要的样本
  4. Script:Diagnostic Resource Manager
  5. B2C网站运营核心数据分析模型
  6. centos7配置php-fpm,centos7 配置php-fpm
  7. paip.提高用户体验----c++图片按钮方法总结
  8. H3CIE(WLAN)学习笔记(2)——通信原理基础
  9. 产品经理进修第六天 产品经理面试
  10. 英语的句号在c语言中是什么意思,英语标点符号的用法
  11. PageOffice 在线打开 word 文件并添加水印
  12. 程序员专属手机壁纸来了。。。
  13. Python启发式算法中爬山法的讲解及解方程问题实战(超详细 附源码)
  14. ixia测试工具的全称_IXIA网络测试仪使用说明
  15. java创建user类在哪里_java中创建对象有哪几种方式
  16. 18软工实践 - 第七次作业 - 需求分析报告
  17. 字符串编码格式互转:GBK、UTF-8、GBKGB2312、ISO-8859-1
  18. CCS使用教程04:程序烧写与仿真
  19. 龙书虎书鲸书啃不动?试试豆瓣评分9.5的猴书
  20. Github公有仓库

热门文章

  1. python 定时执行 爬虫 模块_浅析python实现scrapy定时执行爬虫
  2. java jmap 分析_利用java虚拟机的工具jmap分析java内存情况
  3. 钉钉产品介绍_钉钉上线安全教育新功能家校联动护航学生暑期安全
  4. 单片机8×8点阵显示简单汉字的程序_LED显示屏的显示原理原来是这样,科技实现梦想...
  5. java移动接口发短信_天天都会写接口(interface),但它的用途和好处有多少人能说得清楚?
  6. c++正则表达式_Python正则表达式教程-常用文本处理技巧
  7. firefox 接受post 不完整_HTTP中GET与POST的区别,99 %的人都理解错了
  8. 谁说PCB布线不能走直角。。。
  9. J-Link该如何升级固件?
  10. 2020年电赛题目,命题专家权威解析!