#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];
//必需設(shè)置背景顏色,否則會繪畫出亂
self.backgroundColor=[UIColor clearColor];
}
return self;
}
-(void)setUp
{
//創(chuàng)建9個按鈕
for (int i=0; i<9; i++)
{
UIButton *btn=[UIButton buttonWithType:UIButtonTypeCustom];
//不允許用戶交互,按鈕就不能點擊,也就不能達(dá)到高亮狀態(tài)
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];
}
//只要調(diào)用這個方法,就會把之前繪制的東西全部清掉,重新繪制
- (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)
{
//設(shè)置起點
[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)
{
//點在不在某個范圍內(nèi),并且按鈕沒有被選中
//CGRectContainsPoint(btn.frame, _curtentP) 判斷這個點是不是在這個范圍同一個坐標(biāo)系
if (CGRectContainsPoint(btn.frame, _curtentP) && btn.selected==NO)
{
//點在按鈕上
btn.selected = YES;
//保存到數(shù)組中
[self.selectedsBtn addObject:btn];
}
}
if (pan.state == UIGestureRecognizerStateEnded)
{
//創(chuàng)建可變字符串
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];
}
//為什么要在這個方法布局子控件,因為只要一調(diào)用這個方法,就表示父控件的尺寸確定
-(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];
//獲取當(dāng)前按鈕的列數(shù)
col = i%cols;
row = i/cols;
x = margin + col * (margin + w);
y = row * (margin + w);
btn.frame = CGRectMake(x, y, w, h);
}
}
手勢解鎖
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- GYGestureUnlock Swift版仿支付寶的手勢解鎖,而且提供方法進(jìn)行參數(shù)修改,能解決項目開發(fā)中所有手勢...
- 個人原創(chuàng)文章,請尊重原創(chuàng),轉(zhuǎn)載請注明出處:吳磊的簡書:http://www.itdecent.cn/p/a4c29...
- 好久沒寫文章了,最近也比較偷懶,今天繼續(xù)討論我實際開發(fā)中遇到的需求,那就是關(guān)于APP解鎖,大家都知道?,F(xiàn)在越來越多...
- Demo地址 1.手勢密碼 API 使用方法 2.指紋驗證 關(guān)于指紋驗證,之前一篇文章已經(jīng)寫過,這里簡單封裝了下 ...
- 好多玩具!媽媽快來看,這里好多玩具! 哇哦~這么多多的玩具啊,這是誰的玩具啊寶寶? 媽媽拿一個玩具自己玩,這個給你...