本文实例为大家分享了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
您可能感兴趣的文章:IOS自定义UIButton九宫格效果iOS实现九宫格自动生成视图关于iOS自带九宫格拼音键盘和Emoji表情之间的一些坑IOS 九宫格布局实现方法iOS仿邮箱大师的九宫格手势密码解锁深入解析iOS应用开发中九宫格视图布局的相关计算方法详解iOS应用UI开发中的九宫格坐标计算与字典转换模型使用Swift代码实现iOS手势解锁、指纹解锁实例详解iOS实现手势解锁操作