亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS實現手勢解鎖操作

2020-07-26 03:26:16
字體:
來源:轉載
供稿:網友

本文主要介紹通過手勢識別實現手勢解鎖功能,這個方法被廣泛用于手機解鎖,密碼驗證,快捷支付等功能實現。事例效果如下所示。

 首先,我們先分析功能的實現過程,首先我們需要先看大致的實現過程:

1.加載九宮格頁面

2.實現按鈕被點擊及滑動過程中按鈕狀態的改變

3.實現滑動過程中的連線

4.繪制完畢后判定密碼是否正確,

5.密碼判定后實現跳轉。

下面我們就來用代碼實現上述五個過程。

1.加載九宮格界面

1.1九宮格內控件的分布 3*3 ,我們可以自定義view(包含3*3個按鈕),添加到viewController上。

//添加view中子控件-(void)awakeFromNib{// 創建按鈕 for (int i=0; i<9; i++) {  self.LineColor=[UIColor blueColor]; UIButton *btn=[UIButton buttonWithType:UIButtonTypeCustom];  btn.userInteractionEnabled=NO; //  設置按鈕屬性 [btn setBackgroundImage:[UIImage imageNamed:@"gesture_node_normal"] forState:UIControlStateNormal];  [btn setBackgroundImage:[UIImage imageNamed:@"gesture_node_highlighted"] forState:UIControlStateHighlighted ];  [btn setBackgroundImage:[UIImage imageNamed:@"gesture_node_error"] forState:UIControlStateDisabled];  [self addSubview:btn]; }}//布局view子控件-(void)layoutSubviews{ [super layoutSubviews]; CGFloat width=74; CGFloat height=74; CGFloat Margin=(self.bounds.size.width-3*width)/2;// 遍歷設置9個button的frame [self.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {//  通過tag設置按鈕的索引標識  obj.tag=idx;   int row=(int)idx/3;   int col=idx%3;  obj.frame=CGRectMake(col*(Margin + width), row*(Margin +height), width, height); }];}

1.2將定義好的view通過xib添加到viewController上

首先,定義一個blockview(九宮格view)的類方法,

// 加載xib文件+(instancetype)lockView{ return [[[NSBundle mainBundle]loadNibNamed:@"MYblockView" owner:nil options:nil]lastObject];}

然后加載到控制器上。

// 設置控制器view的背景圖片 self.view.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"bg"]]; MYblockView *blockView=[MYblockView lockView]; blockView.center=self.view.center;// 將blockview添加到viewController上 [self.view addSubview:blockView];

2.實現按鈕被點擊及滑動過程中按鈕狀態的改變

2.1定義數組類型的成員屬性,用來裝被點擊的按鈕

@property(nonatomic,strong)NSMutableArray *btnArr;//懶加載-(NSMutableArray *)btnArr{ if (_btnArr==nil) {  _btnArr=[NSMutableArray array]; } return _btnArr;}

2.2創建路徑,繪制圖形

#pragma mark----繪制圖形-(void)drawRect:(CGRect)rect{ if (self.btnArr.count==0 ) {  return; }// 創建路徑 UIBezierPath *path=[UIBezierPath bezierPath];// 遍歷所有按鈕進行繪制 [self.btnArr enumerateObjectsUsingBlock:^(__kindof UIButton * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {//  第一個按鈕,中心點就是起點  if (idx==0) {   [path moveToPoint:obj.center];  }else  {   [path addLineToPoint:obj.center];  } }]; [path addLineToPoint:self.currentPoint];// 設置路徑屬性 path.lineWidth=10; path.lineCapStyle=kCGLineCapRound; path.lineJoinStyle=kCGLineJoinRound; [self.LineColor setStroke];// 渲染 [path stroke];}

2.3開始觸摸

#pragma mark-----開始觸摸-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{// 獲取觸摸對象 UITouch *touch=touches.anyObject;// 獲取觸摸點 CGPoint loc=[touch locationInView:self];// 遍歷按鈕,判定觸摸點是否在按鈕上 [self.subviews enumerateObjectsUsingBlock:^(__kindof UIButton * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {  BOOL isContains=CGRectContainsPoint(obj.frame, loc);//  如果在按鈕上,將當前按鈕保存在數組中,并改變按鈕狀態  if (isContains&&obj.highlighted==NO) {   [self.btnArr addObject:obj];   obj.highlighted=YES;  }else  {   obj.highlighted=NO;  } }];}

2.4滑動過程中,重繪

#pragma mark----開始滑動-(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{// 獲取觸摸對象 UITouch *touch=touches.anyObject;// 獲取觸摸點 CGPoint loc=[touch locationInView:self]; self.currentPoint=loc;// 遍歷按鈕,如果按鈕在滑動路徑上,就改變按鈕狀態 [self.subviews enumerateObjectsUsingBlock:^(__kindof UIButton * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {  BOOL isContains=CGRectContainsPoint(obj.frame, loc);  if (isContains&&obj.highlighted==NO) {   [self.btnArr addObject:obj];   obj.highlighted=YES;  } }];// 重繪 [self setNeedsDisplay];  }

3.實現滑動過程中的連線和4.繪制完畢后判定密碼是否正確

#pragma mark----停止滑動結束-(void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{// 定義最后一個按鈕 UIButton *lastBtn=[self.btnArr lastObject];// 將最后一個按鈕中心點定義為相對滑動的當前點 self.currentPoint=lastBtn.center;// 重繪 [self setNeedsDisplay];// 判定密碼 self.password=[NSMutableString string];  [self.btnArr enumerateObjectsUsingBlock:^( UIButton * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {   [self.password appendFormat:@"%@",@(obj.tag)];  }]; NSLog(@"%@",self.password); BOOL isOk; if ([self.delegate respondsToSelector:@selector(blockView:finishedWithPassword:)]) {  isOk= [self.delegate blockView:self finishedWithPassword:self.password]; } if (isOk) {  [self.btnArr enumerateObjectsUsingBlock:^(UIButton* _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {   obj.highlighted=NO;     }];  [self.btnArr removeAllObjects];  [self setNeedsDisplay];    NSLog(@"密碼正確"); }else {  NSLog(@"密碼錯誤"); }}

注意:我們在密碼判定過程中是通過根據先前布局按鈕的時候定義的按鈕tag值進行字符串拼接,密碼傳值是通過代理實現。

#import <UIKit/UIKit.h>@class MYblockView;//聲明代理@protocol MYblockViewDelegate <NSObject>@optional//代理方法-(BOOL) blockView:(MYblockView *)blockView finishedWithPassword:(NSString *)password;@end@interface MYblockView : UIView+(instancetype)lockView;//設置代理成員屬性@property(nonatomic,weak)id<MYblockViewDelegate>delegate;@end

5.密碼判定后實現跳轉。

else {  //  關閉用戶交互  self.userInteractionEnabled=NO;  [self.btnArr enumerateObjectsUsingBlock:^(UIButton * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {   self.LineColor=[UIColor redColor];   obj.highlighted=NO;   obj.enabled=NO;   [self setNeedsDisplay];      dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{//    回復按鈕狀態    [self.btnArr enumerateObjectsUsingBlock:^(UIButton * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {     obj.enabled=YES;        }];//    恢復線條的顏色    self.LineColor=[UIColor blueColor];        [self.btnArr removeAllObjects];        [self setNeedsDisplay];      });   }];   NSLog(@"密碼錯誤"); } self.userInteractionEnabled=YES;}

代理判定密碼并實現跳轉

-(BOOL)blockView:(MYblockView *)blockView finishedWithPassword:(NSString *)password{ if ([password isEqualToString:@"012"]) {    UIViewController *two=[UIViewController new];  two.view.backgroundColor=[UIColor greenColor];  [self.navigationController pushViewController:two animated:YES];  return YES; } else{   return NO; }}

最后設置控制器navigationbar屬性

 [self.navigationController.navigationBar setBackgroundColor:[UIColor redColor]]; [ self.navigationController.navigationBar setTitleTextAttributes:@{               NSForegroundColorAttributeName :[UIColor whiteColor]                   }];

以上就是本文的全部內容,希望對大家的學習有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲色图国产精品| 国产在线久久久| 精品国产户外野外| 日韩高清电影好看的电视剧电影| 精品国产999| 欧美日韩国产一区在线| 中国china体内裑精亚洲片| 欧美电影院免费观看| 久久人人爽亚洲精品天堂| 日韩中文字幕在线观看| 日韩欧美国产中文字幕| 欧美日韩国产一区二区| 欧美一级片久久久久久久| 欧美大片欧美激情性色a∨久久| 欧美色欧美亚洲高清在线视频| 亚洲一区二区三区四区在线播放| 欧美激情xxxx性bbbb| 久久久影视精品| 国产精品欧美激情在线播放| 亚洲国产高清高潮精品美女| 2019国产精品自在线拍国产不卡| 国产精品成人一区| 精品视频www| 亚洲成人a**站| 欧美综合国产精品久久丁香| 狠狠躁夜夜躁人人躁婷婷91| 欧美肥臀大乳一区二区免费视频| 免费99精品国产自在在线| 欧美极品少妇xxxxⅹ喷水| 中文字幕亚洲欧美日韩在线不卡| 久久人人爽人人爽人人片亚洲| 亚洲第一男人av| 国产偷国产偷亚洲清高网站| 中文字幕亚洲欧美日韩2019| 亚洲国产精品电影在线观看| 久久精品视频中文字幕| 亚洲性线免费观看视频成熟| 久久久久久伊人| 国产精品精品国产| 亚洲最新av网址| 一本一道久久a久久精品逆3p| 欧美整片在线观看| 欧美性高潮床叫视频| 亚洲丁香婷深爱综合| 青青在线视频一区二区三区| 97免费中文视频在线观看| 国产精品久久久久aaaa九色| 久久久精品美女| 日韩av电影在线网| 亚洲人成绝费网站色www| 欧美成人剧情片在线观看| 亚洲肉体裸体xxxx137| 久久久国产精品x99av| 国产成人综合精品在线| 国产欧美日韩中文| 国产一区二区av| 国产婷婷成人久久av免费高清| 欧美日韩在线看| 综合激情国产一区| 久久视频在线视频| 精品露脸国产偷人在视频| 91人人爽人人爽人人精88v| 在线观看日韩av| 国产精品久久久| 这里只有精品久久| 欧美激情中文网| 国产成人a亚洲精品| 国产一区二区三区网站| 欧美在线视频观看| 国产精品专区第二| 国产一区二区三区丝袜| 国产剧情久久久久久| 精品福利在线观看| 欧美成人免费播放| 久久在精品线影院精品国产| 最近2019年好看中文字幕视频| 欧美综合国产精品久久丁香| 久久成人精品一区二区三区| 日韩中文字幕亚洲| 最近2019好看的中文字幕免费| 国产日韩精品入口| 国产区亚洲区欧美区| 国产精品成人久久久久| 久久全球大尺度高清视频| 亚洲欧美另类自拍| 久久久久亚洲精品国产| 亚洲在线视频福利| 亚洲综合中文字幕在线观看| 亚洲电影第1页| 91系列在线播放| 欧美日韩国产中字| 亚洲人成电影网站色| 中文日韩在线视频| 亚洲性夜色噜噜噜7777| 久久成人精品电影| 欧美国产高跟鞋裸体秀xxxhd| 在线精品视频视频中文字幕| 日韩中文字幕免费| 成人av在线亚洲| 亚洲影院污污.| 亚洲无线码在线一区观看| 日韩在线观看视频免费| 亚洲欧美日韩国产成人| 国产视频精品在线| 久久天天躁狠狠躁夜夜爽蜜月| 国产午夜精品全部视频在线播放| 国产精品私拍pans大尺度在线| 日韩欧美国产网站| 一色桃子一区二区| 亚洲精品久久久一区二区三区| 国产精品一区=区| 中文字幕亚洲综合久久筱田步美| 日韩中文字幕免费| 日韩欧美在线视频| 欧美亚洲午夜视频在线观看| 91免费看国产| 亚洲人成电影在线播放| 久久久久久久一区二区三区| 日韩av大片在线| 亚洲福利视频网站| 成年人精品视频| 国产丝袜精品第一页| 在线看欧美日韩| 久久久久久com| 久久亚洲影音av资源网| 4438全国亚洲精品在线观看视频| 久久的精品视频| 欧美日本国产在线| 欧美高清在线观看| 亚洲欧美制服综合另类| 久久91亚洲精品中文字幕奶水| 久久亚洲国产精品成人av秋霞| 国产精品18久久久久久麻辣| 91精品国产91久久久久久| 97欧美精品一区二区三区| 疯狂做受xxxx欧美肥白少妇| 成人免费视频xnxx.com| 高清一区二区三区日本久| 中文字幕九色91在线| 欧洲中文字幕国产精品| 欧美一级大片在线观看| 欧美综合激情网| 九九精品视频在线| 久久久久久久久综合| 久久99久久99精品免观看粉嫩| 国产精品久久久久久久久免费| 欧美日韩免费看| 久久久久亚洲精品国产| 国产欧美一区二区三区视频| 国产午夜精品麻豆| 555www成人网| 欧美丝袜第一区| 国精产品一区一区三区有限在线| 亚洲天堂2020| 欧美与欧洲交xxxx免费观看| 91精品久久久久久久久久| 国产精品久久久久久久久粉嫩av| 国产97在线视频| 欧美俄罗斯性视频| 国产欧美一区二区三区在线看| 4444欧美成人kkkk| 欧美激情一区二区久久久| 欧美极品少妇xxxxⅹ喷水| 日韩在线高清视频|