iOS仿郵箱大師的九宮格手勢(shì)密碼解鎖
本文實(shí)例為大家分享了iOS手勢(shì)密碼解鎖的相關(guān)代碼,供大家參考,具體內(nèi)容如下
// // LockView.m // 手勢(shì)解鎖 // // 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; //將這個(gè)選中的按鈕保存起來(lái) [self.selectedBtn addObject:btn]; } } //重繪,調(diào)用drawRect方法 [self setNeedsDisplay]; //手指抬起時(shí) if(pan.state == UIGestureRecognizerStateEnded) { NSMutableString *strM = [NSMutableString string]; //如果當(dāng)前觸摸點(diǎn)不在Button上,則手指抬起時(shí),就顯示選中的Button以及連線(xiàn) UIButton *lastBtn = [self.selectedBtn lastObject]; //把最后一個(gè)選中按鈕的中心點(diǎn)設(shè)置為當(dāng)前觸摸點(diǎn),清除最后多出來(lái)的一截連線(xiàn) _curp = lastBtn.center; for (UIButton *btn in self.selectedBtn) { //保存手勢(shì)密碼 [strM appendFormat:@"%ld", btn.tag]; } //strM就是密碼了 NSLog(@"%@",strM); //TODO:對(duì)比之前保存的密碼,如果對(duì)了就直接跳轉(zhuǎn)界面了 //NSLog(@"手指抬起"); //這里了執(zhí)行完之后系統(tǒng)自動(dòng)調(diào)用了重繪方法 //等待2s后清除所有連線(xiàn),清除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];這句不知道為啥沒(méi)有效果,只好用循環(huán)了 for (UIButton *btn in self.selectedBtn) { [btn setSelected:NO]; } //清除連線(xiàn),清空選中按鈕 [self.selectedBtn removeAllObjects]; [self setNeedsDisplay]; }); } } - (void)drawRect:(CGRect)rect { NSInteger count = self.selectedBtn.count; //如果沒(méi)有按鈕被選中,就不畫(huà)線(xiàn) if (count == 0) { return; } UIBezierPath *path = [UIBezierPath bezierPath]; //把所有點(diǎn)都連完線(xiàn) for (int i = 0; i < count; i++) { UIButton * btn = self.selectedBtn[i]; if (i == 0) { //如果是第一個(gè)點(diǎn),就設(shè)置為起點(diǎn) [path moveToPoint:btn.center]; }else { //添加連線(xiàn) [path addLineToPoint: btn.center]; } } //畫(huà)最后一個(gè)點(diǎn)到手指觸摸點(diǎn)之間的線(xiàn) [path addLineToPoint:_curp]; [[UIColor greenColor]set]; path.lineJoinStyle = kCGLineJoinRound; path.lineWidth = 8; [path stroke]; } - (void)awakeFromNib { //創(chuàng)建9個(gè)按鈕 for (int i = 0; i < 9; i++) { UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; //不允許與用戶(hù)交互,也就是點(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]; //計(jì)算當(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
效果圖:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。
- IOS自定義UIButton九宮格效果
- iOS實(shí)現(xiàn)九宮格自動(dòng)生成視圖
- 關(guān)于iOS自帶九宮格拼音鍵盤(pán)和Emoji表情之間的一些坑
- IOS 九宮格布局實(shí)現(xiàn)方法
- 深入解析iOS應(yīng)用開(kāi)發(fā)中九宮格視圖布局的相關(guān)計(jì)算方法
- 詳解iOS應(yīng)用UI開(kāi)發(fā)中的九宮格坐標(biāo)計(jì)算與字典轉(zhuǎn)換模型
- 使用Swift代碼實(shí)現(xiàn)iOS手勢(shì)解鎖、指紋解鎖實(shí)例詳解
- iOS實(shí)現(xiàn)手勢(shì)解鎖操作
- iOS實(shí)現(xiàn)九宮格連線(xiàn)手勢(shì)解鎖
相關(guān)文章
iOS Remote Notification遠(yuǎn)程消息推送處理
這篇文章主要為大家詳細(xì)介紹了iOS Remote Notification遠(yuǎn)程消息推送處理,感興趣的小伙伴們可以參考一下2016-09-09iOS開(kāi)發(fā)中導(dǎo)航控制器的基本使用教程
這篇文章主要介紹了iOS開(kāi)發(fā)中導(dǎo)航控制器的基本使用教程,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2015-11-11iOS中l(wèi)ebel特殊字符的自動(dòng)換行問(wèn)題解決
這篇文章主要給大家介紹了關(guān)于iOS中l(wèi)ebel特殊字符的實(shí)現(xiàn)不自動(dòng)換行的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)iOS具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10iOS實(shí)現(xiàn)獲取系統(tǒng)iTunes音樂(lè)的方法示例
這篇文章主要給大家介紹了關(guān)于iOS如何實(shí)現(xiàn)獲取系統(tǒng)iTunes音樂(lè)的相關(guān)資料,文中通過(guò)示例代碼給大家詳細(xì)介紹了實(shí)現(xiàn)的方法,并給大家介紹了MPMediaPickerController的相關(guān)知識(shí),對(duì)大家的學(xué)習(xí)或者工作具有一定的幫助,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11iOS自定義UICollectionViewLayout實(shí)現(xiàn)瀑布流布局
這篇文章主要為大家詳細(xì)介紹了iOS自定義UICollectionViewLayout實(shí)現(xiàn)瀑布流布局,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12詳解iOS開(kāi)發(fā)中解析JSON中的boolean類(lèi)型的數(shù)據(jù)遇到的問(wèn)題
這篇文章主要介紹了詳解iOS開(kāi)發(fā)中解析JSON中的boolean類(lèi)型的數(shù)據(jù)遇到的問(wèn)題,具有一定的參考價(jià)值,有興趣的可以了解一下。2016-12-12iOS應(yīng)用開(kāi)發(fā)中使UITextField實(shí)現(xiàn)placeholder屬性的方法
這篇文章主要介紹了iOS應(yīng)用開(kāi)發(fā)中使UITextField實(shí)現(xiàn)placeholder屬性的方法,示例代碼為傳統(tǒng)的Objective-C語(yǔ)言,需要的朋友可以參考下2016-04-04ios開(kāi)發(fā):一個(gè)音樂(lè)播放器的設(shè)計(jì)與實(shí)現(xiàn)案例
本篇文章主要介紹了ios開(kāi)發(fā):一個(gè)音樂(lè)播放器的設(shè)計(jì)與實(shí)現(xiàn)案例,具有一定的參考價(jià)值,有需要的小伙伴可以參考下。2016-11-11