iOS实现九宫格连线手势解锁
程序员文章站
2023-11-18 21:27:40
本文实例为大家分享了ios实现九宫格连线手势解锁的具体代码,供大家参考,具体内容如下demo下载地址:效果图:核心代码://// clockview.m// 手势解锁//// created by l...
本文实例为大家分享了ios实现九宫格连线手势解锁的具体代码,供大家参考,具体内容如下
demo下载地址:
效果图:
核心代码:
// // clockview.m // 手势解锁 // // created by llkj on 2017/8/24. // copyright © 2017年 laynecheung. all rights reserved. // #import "clockview.h" @interface clockview () //存放当前选中的按钮 @property (nonatomic, strong) nsmutablearray *selectbtnarry; //当前手指所在点 @property (nonatomic, assign) cgpoint curp; @end @implementation clockview - (void)awakefromnib{ [super awakefromnib]; //初始化 [self setup]; } - (nsmutablearray *)selectbtnarry{ if (_selectbtnarry == nil) { _selectbtnarry = [nsmutablearray array]; } return _selectbtnarry; } - (void)setup{ for (int i = 0; i < 9; i ++) { //创建按钮 uibutton *btn = [uibutton buttonwithtype:uibuttontypecustom]; btn.tag = i; btn.userinteractionenabled = no; [btn setimage:[uiimage imagenamed:@"gesture_node_normal"] forstate:uicontrolstatenormal]; [btn setimage:[uiimage imagenamed:@"gesture_node_selected"] forstate:uicontrolstateselected]; [self addsubview:btn]; } } //获取当前点 - (cgpoint)getcurrentpoint:(nsset *)point{ uitouch *touch = [point anyobject]; return [touch locationinview:self]; } //返回按钮 - (uibutton *)btnrectcontainspoint:(cgpoint)point{ //遍历brn判断当前点在不在btn上 for (uibutton *btn in self.subviews) { if (cgrectcontainspoint(btn.frame, point)) { return btn; } } return nil; } - (void)touchesbegan:(nsset<uitouch *> *)touches withevent:(uievent *)event{ //1.获取当前点 cgpoint curp = [self getcurrentpoint:touches]; //2.判断当前点在不在btn上 uibutton *btn = [self btnrectcontainspoint:curp]; if (btn && btn.selected == no) { btn.selected = yes; //保存选中的按钮 [self.selectbtnarry addobject:btn]; } } - (void)touchesmoved:(nsset<uitouch *> *)touches withevent:(uievent *)event{ //1.获取当前点 cgpoint curp = [self getcurrentpoint:touches]; self.curp = curp; //2.判断当前点在不在btn上 uibutton *btn = [self btnrectcontainspoint:curp]; if (btn && btn.selected == no) { btn.selected = yes; //保存选中的按钮 [self.selectbtnarry addobject:btn]; } //重绘 [self setneedsdisplay]; } - (void)touchesended:(nsset<uitouch *> *)touches withevent:(uievent *)event{ nsmutablestring *str = [nsmutablestring string]; //1.取消所有选中的按钮 for (uibutton *btn in self.selectbtnarry) { btn.selected = no; [str appendformat:@"%ld", btn.tag]; } //2.清空路径 [self.selectbtnarry removeallobjects]; [self setneedsdisplay]; //查看是否是第一次设置密码 nsstring *keypwd = [[nsuserdefaults standarduserdefaults] objectforkey:@"keypwd"]; if (!keypwd) { [[nsuserdefaults standarduserdefaults] setobject:str forkey:@"keypwd"]; [[nsuserdefaults standarduserdefaults] synchronize]; uialertview *alertv = [[uialertview alloc] initwithtitle:@"第一次设置密码成功" message:nil delegate:nil cancelbuttontitle:@"确定" otherbuttontitles:nil, nil]; [alertv show]; nslog(@"第一次输入密码"); }else{ if ([keypwd isequaltostring:str]) { nslog(@"密码正确"); uialertview *alertv = [[uialertview alloc] initwithtitle:@"手势输入正确" message:nil delegate:nil cancelbuttontitle:@"确定" otherbuttontitles:nil, nil]; [alertv show]; }else{ nslog(@"密码错误"); uialertview *alertv = [[uialertview alloc] initwithtitle:@"手势输入错误" message:nil delegate:nil cancelbuttontitle:@"确定" otherbuttontitles:nil, nil]; [alertv show]; } } //3.查看当前选中按钮的顺序 nslog(@"选中按钮顺序为:%@",str); } - (void)drawrect:(cgrect)rect{ if (self.selectbtnarry.count) { //1.创建路径 uibezierpath *path = [uibezierpath bezierpath]; //2.取出所有保存的按钮 for (int i = 0; i < self.selectbtnarry.count; i ++) { uibutton *btn = self.selectbtnarry[i]; //当前按钮是不是第一个按钮 if (i == 0) { //设置成路径的起点 [path movetopoint:btn.center]; } else { //添加一根线到按钮中心 [path addlinetopoint:btn.center]; } } //添加一根线到当前手指所在点 [path addlinetopoint:self.curp]; //设置线宽/颜色 [path setlinewidth:5]; [[uicolor whitecolor] set]; [path setlinejoinstyle:kcglinejoinround]; //3.绘制路径 [path stroke]; } } - (void)layoutsubviews{ [super layoutsubviews]; cgfloat x = 0; cgfloat y = 0; cgfloat btnwh = 75; int column = 3; int margin = (self.bounds.size.width - (column * btnwh)) / (column + 1); int currentcolumn = 0; int currentrow = 0; for (int i = 0; i < self.subviews.count; i ++) { // 求当前所在的列 currentcolumn = i % column; // 求当前所在的行 currentrow = i / column; x = margin + (btnwh + margin) * currentcolumn; y = margin + (btnwh + margin) * currentrow; uibutton *btn = self.subviews[i]; btn.frame = cgrectmake(x, y, btnwh, btnwh); } } @end
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: Mongodb集群架构之分片架构
下一篇: 详解js异步文件加载器