#import "LockView.h"
@interface LockView ()
@property(nonatomic,assign)CGPoint curtentP;
@property(nonatomic,retain)NSMutableArray * selectedsBtn;
@end
@implementation LockView
-(NSMutableArray*)selectedsBtn
{
if (!_selectedsBtn)
{
_selectedsBtn=[NSMutableArray array];
}
return _selectedsBtn;
}
-(instancetype)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame])
{
[self setUp];
//必需设置背景颜色,否则会绘画出乱
self.backgroundColor=[UIColor clearColor];
}
return self;
}
-(void)setUp
{
//创建9个按钮
for (int i=0; i<9; i++)
{
UIButton *btn=[UIButton buttonWithType:UIButtonTypeCustom];
//不允许用户交互,按钮就不能点击,也就不能达到高亮状态
btn.userInteractionEnabled=NO;
btn.tag = i;
[btn setImage:[UIImage imageNamed:@"gesture_node_normal"] forState:UIControlStateNormal];
[btn setImage:[UIImage imageNamed:@"gesture_node_highlighted"] forState:UIControlStateSelected];
[self addSubview:btn];
}
UIPanGestureRecognizer *pan=[[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(pan:)];
[self addGestureRecognizer:pan];
}
//只要调用这个方法,就会把之前绘制的东西全部清掉,重新绘制
- (void)drawRect:(CGRect)rect
{
//没有选中按钮,不需要连线
if (self.selectedsBtn.count ==0) return;
//把所有选中按钮中心点连线
UIBezierPath *path = [UIBezierPath bezierPath];
NSUInteger count = self.selectedsBtn.count;
//把所有选中按钮之间都连好线
for (int i = 0; i<count; i++)
{
UIButton *btn = self.selectedsBtn[i];
if (i == 0)
{
//设置起点
[path moveToPoint:btn.center];
}
else
{
[path addLineToPoint:btn.center];
}
}
//连线到手指的触摸点
if (self.selectedsBtn.count>0)
{
[path addLineToPoint:_curtentP];
}
[[UIColor greenColor] set];
path.lineWidth = 10;
path.lineJoinStyle = kCGLineJoinRound;
[path stroke];
}
-(void)pan:(UIPanGestureRecognizer*)pan
{
//获取触摸点
_curtentP = [pan locationInView:self];
//判断触摸点在不在按钮上
for (UIButton*btn in self.subviews)
{
//点在不在某个范围内,并且按钮没有被选中
//CGRectContainsPoint(btn.frame, _curtentP) 判断这个点是不是在这个范围同一个坐标系
if (CGRectContainsPoint(btn.frame, _curtentP) && btn.selected==NO)
{
//点在按钮上
btn.selected = YES;
//保存到数组中
[self.selectedsBtn addObject:btn];
}
}
if (pan.state == UIGestureRecognizerStateEnded)
{
//创建可变字符串
NSMutableString *strM = [NSMutableString string];
//保存输入密码
for (UIButton*btn in self.selectedsBtn)
{
[strM appendFormat:@"%ld",btn.tag];
btn.selected=NO;
}
NSLog(@"%@",strM);
//还原界面
//清除画线,把选中按钮清空
[self.selectedsBtn removeAllObjects];
}
//重绘
[self setNeedsDisplay];
}
//为什么要在这个方法布局子控件,因为只要一调用这个方法,就表示父控件的尺寸确定
-(void)layoutSubviews
{
[super layoutSubviews];
NSUInteger count = self.subviews.count;
int cols = 3;
CGFloat x = 0;
CGFloat y = 0;
CGFloat w = 74;
CGFloat h = 74;
CGFloat margin = (self.bounds.size.width - cols*w)/(cols+1);
CGFloat col = 0;
CGFloat row = 0;
for (NSUInteger i=0; i<count; i++)
{
UIButton*btn = self.subviews[i];
//获取当前按钮的列数
col = i%cols;
row = i/cols;
x = margin + col * (margin + w);
y = row * (margin + w);
btn.frame = CGRectMake(x, y, w, h);
}
}
手势解锁
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- GYGestureUnlock Swift版仿支付宝的手势解锁,而且提供方法进行参数修改,能解决项目开发中所有手势...
- 个人原创文章,请尊重原创,转载请注明出处:吴磊的简书://www.greatytc.com/p/a4c29...
- 好久没写文章了,最近也比较偷懒,今天继续讨论我实际开发中遇到的需求,那就是关于APP解锁,大家都知道。现在越来越多...
- Demo地址 1.手势密码 API 使用方法 2.指纹验证 关于指纹验证,之前一篇文章已经写过,这里简单封装了下 ...
- 好多玩具!妈妈快来看,这里好多玩具! 哇哦~这么多多的玩具啊,这是谁的玩具啊宝宝? 妈妈拿一个玩具自己玩,这个给你...