本文實(shí)例為大家分享了iOS手勢密碼解鎖的相關(guān)代碼,供大家參考,具體內(nèi)容如下
//// LockView.m// 手勢解鎖//// Created by Daniel on 16/4/4.// Copyright © 2016年 Daniel. All rights reserved.// #import "LockView.h" @interface LockView () /** 保存已選中的按鈕 */@property(nonatomic, strong) NSMutableArray *selectedBtn;/** 當(dāng)前觸摸點(diǎn) */@property(nonatomic, assign) CGPoint curp;@end @implementation LockView - (NSMutableArray *)selectedBtn { if (_selectedBtn == nil) { _selectedBtn = [NSMutableArray array]; } return _selectedBtn;} - (IBAction)pan:(UIPanGestureRecognizer *)pan { //獲取當(dāng)前觸摸點(diǎn) _curp = [pan locationInView:self]; //判斷觸摸點(diǎn)在不在按鈕上 for (UIButton *btn in self.subviews) { //如果在按鈕上就設(shè)置選中狀態(tài) //觸摸點(diǎn)必須在button中心點(diǎn)30范圍內(nèi)才選中,更精確,體驗(yàn)更好 CGRect rect = CGRectMake(btn.center.x, btn.center.y, 30, 30); if (CGRectContainsPoint(rect, _curp) && btn.selected == NO) { btn.selected = YES; //將這個選中的按鈕保存起來 [self.selectedBtn addObject:btn]; } } //重繪,調(diào)用drawRect方法 [self setNeedsDisplay]; //手指抬起時 if(pan.state == UIGestureRecognizerStateEnded) { NSMutableString *strM = [NSMutableString string]; //如果當(dāng)前觸摸點(diǎn)不在Button上,則手指抬起時,就顯示選中的Button以及連線 UIButton *lastBtn = [self.selectedBtn lastObject]; //把最后一個選中按鈕的中心點(diǎn)設(shè)置為當(dāng)前觸摸點(diǎn),清除最后多出來的一截連線 _curp = lastBtn.center; for (UIButton *btn in self.selectedBtn) { //保存手勢密碼 [strM appendFormat:@"%ld", btn.tag]; } //strM就是密碼了 NSLog(@"%@",strM); //TODO:對比之前保存的密碼,如果對了就直接跳轉(zhuǎn)界面了 //NSLog(@"手指抬起"); //這里了執(zhí)行完之后系統(tǒng)自動調(diào)用了重繪方法 //等待2s后清除所有連線,清除Button的選中狀態(tài) dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ //取消按鈕選中 //[self.selectedBtn makeObjectsPerformSelector:@selector(setSelected:) withObject:NO];這句不知道為啥沒有效果,只好用循環(huán)了 for (UIButton *btn in self.selectedBtn) { [btn setSelected:NO]; } //清除連線,清空選中按鈕 [self.selectedBtn removeAllObjects]; [self setNeedsDisplay]; }); } } - (void)drawRect:(CGRect)rect { NSInteger count = self.selectedBtn.count; //如果沒有按鈕被選中,就不畫線 if (count == 0) { return; } UIBezierPath *path = [UIBezierPath bezierPath]; //把所有點(diǎn)都連完線 for (int i = 0; i < count; i++) { UIButton * btn = self.selectedBtn[i]; if (i == 0) { //如果是第一個點(diǎn),就設(shè)置為起點(diǎn) [path moveToPoint:btn.center]; }else { //添加連線 [path addLineToPoint: btn.center]; } } //畫最后一個點(diǎn)到手指觸摸點(diǎn)之間的線 [path addLineToPoint:_curp]; [[UIColor greenColor]set]; path.lineJoinStyle = kCGLineJoinRound; path.lineWidth = 8; [path stroke]; } - (void)awakeFromNib { //創(chuàng)建9個按鈕 for (int i = 0; i < 9; i++) { UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; //不允許與用戶交互,也就是點(diǎn)擊事件不作處理 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]; } } - (void)layoutSubviews { [super layoutSubviews]; //布局子控件 NSInteger count = self.subviews.count; //列數(shù) int cols = 3; CGFloat x = 0; CGFloat y = 0; CGFloat w = 74; CGFloat h = 74; //間距 CGFloat margin = (self.bounds.size.width - w * cols) / (cols + 1); CGFloat col = 0; CGFloat row = 0; for (NSInteger i = 0; i < count; i++) { UIButton *btn = self.subviews[i]; //計算當(dāng)前button的列行以及xy值 col = i % cols; row = i / cols; x = margin + col * (margin + w); y = row * (margin + w); btn.frame = CGRectMake(x, y, w, h); } } @end效果圖:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助。
新聞熱點(diǎn)
疑難解答
圖片精選