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

首頁 > 系統 > iOS > 正文

iOS實現手勢密碼功能

2020-07-26 02:54:08
字體:
來源:轉載
供稿:網友

手勢密碼實現

手勢密碼 一般常常用于金融項目,做的是安全相關的業務。具體實現如下思路,我把它分為view層和邏輯層。我將數據層合并到view層中了,最好是加上數據層用于處理加密的密碼和密碼的存儲

view層

view層主要處理,包括(九個按鈕)touchesBegan,touchesMoved,touchesEnded,點與點之間畫線,手指滑動畫線,畫線主要是在drawRect中重繪,提到這里必須不能忘記setNeedsDisplay這個方法。還要記錄經過的按鈕btnsArray(存放按鈕的數組),這個 可以和相關的具體值做映射,也可以直接設置btn 的tag,還要添加完成繪畫的回調。提供給邏輯層去處理。

邏輯層

用于處理完成交互后的業務,包括(請求接口,異常邏輯顯示,等等)
具體的demo點這里

具體的code:
view.h

//// YHGesturePasswordView.h// 手勢密碼//// Created by mrlee on 2017/3/5.// Copyright © 2017年 mrlee. All rights reserved.//typedef enum {  GestureSetPassword, //設置手勢密碼  GestureResultPassword //已有手勢密碼教驗} PasswordState;//設置密碼的3種狀態typedef enum {  FristPwd, //第一次設置密碼  PwdNoValue, //二次設置密碼不一致  SetPwdSuccess, //設置密碼成功  Other}SetPwdState;#import <UIKit/UIKit.h>@interface YHGesturePasswordView : UIView/** btn圖片*/@property (nonatomic,strong)UIImage *btnImage;///選中的圖片@property (nonatomic,strong)UIImage *btnSelectImage;///劃線顏色@property (nonatomic,strong)UIColor *lineColor;/** 解鎖手勢完成之后判斷結果時調用的block */@property (nonatomic,copy)BOOL (^sendReaultData)(NSString *str);//設置手勢密碼@property(nonatomic,copy)void(^setPwdBlock)(SetPwdState pwdState);// init-(instancetype)initWithFrame:(CGRect)frame WithState:(PasswordState)state;@end

view.m

//// YHGesturePasswordView.m// 手勢密碼//// Created by mrlee on 2017/3/5.// Copyright © 2017年 mrlee. All rights reserved.//#define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width#define SCREEN_HEIGHT [UIScreen mainScreen].bounds.size.height#import "YHCustomButton.h"#import "YHGesturePasswordView.h"#import <CommonCrypto/CommonDigest.h>@interface YHGesturePasswordView(){  /** 判斷是當設置密碼用,還是解鎖密碼用*/  PasswordState Amode;}/** 所有的按鈕集合*/@property (nonatomic,strong)NSMutableArray * allBtnsArray;/** 解鎖時手指經過的所有的btn集合*/@property (nonatomic,strong)NSMutableArray * btnsArray;/** 手指當前的觸摸位置*/@property (nonatomic,assign)CGPoint currentPoint;@end@implementation YHGesturePasswordView-(instancetype)initWithFrame:(CGRect)frame WithState:(PasswordState)state{  self = [super initWithFrame:frame];  if (self) {     self.backgroundColor = [UIColor clearColor];    Amode = state;    for (int i = 0; i<9; i++) {      YHCustomButton *btn = [[YHCustomButton alloc]init];      [btn setTag:i];      btn.userInteractionEnabled = NO;      if (self.lineColor == nil) {        self.lineColor = [UIColor greenColor];      }      [self addSubview:btn];    }  }  return self;}-(void)drawRect:(CGRect)rect{  // 每次調用這個方法的時候如果背景顏色是default會產生緩存,如果設置了顏色之后就沒有緩存,繪制之前需要清除緩存  CGContextRef ctx = UIGraphicsGetCurrentContext();  CGContextClearRect(ctx, rect);//清空上下文  for (int i = 0; i<self.btnsArray.count; i++) {    UIButton *btn = self.btnsArray[i];    if (i == 0) {      CGContextMoveToPoint(ctx, btn.center.x, btn.center.y);    }else{      CGContextAddLineToPoint(ctx, btn.center.x, btn.center.y);    }  }  if (!CGPointEqualToPoint(self.currentPoint, CGPointZero)) {//如果起點不是CGPointZero的話才來劃線    CGContextAddLineToPoint(ctx, self.currentPoint.x, self.currentPoint.y);  }  CGContextSetLineWidth(ctx, 12);  CGContextSetLineCap(ctx, kCGLineCapRound);  CGContextSetLineJoin(ctx, kCGLineJoinRound);  [self.lineColor set];  CGContextStrokePath(ctx);}-(void)layoutSubviews{   [self.allBtnsArray removeAllObjects];  for (int index =0; index<self.subviews.count; index ++) {    if ([self.subviews[index] isKindOfClass:[YHCustomButton class]]) {      [self.allBtnsArray addObject:self.subviews[index]];    }  }  // button 繪制九宮格  [self drawUi];}#pragma mark Private method-(void)drawUi{  for (int index = 0; index<self.allBtnsArray.count; index ++) {    //拿到每個btn    UIButton *btn = self.subviews[index];    //設置frame    CGFloat btnW = 74;    CGFloat btnH = 74;    CGFloat margin = (SCREEN_WIDTH - (btnW *3))/4;    //x = 間距 + 列號*(間距+btnW)    CGFloat btnX = margin + (index % 3)*(margin + btnW);    CGFloat btnY = margin + (index / 3)*(margin + btnH);    btn.frame = CGRectMake(btnX, btnY, btnW, btnH);  }}//設置密碼-(SetPwdState)pwdValue:(NSString *)str{  if ([[NSUserDefaults standardUserDefaults] objectForKey:@"pwdValue"] == nil) {    //第一次設置    [[NSUserDefaults standardUserDefaults] setValue:str forKey:@"pwdValue"];    return FristPwd;  }  if ([str isEqualToString: [[NSUserDefaults standardUserDefaults]objectForKey:@"pwdValue"]]) {    //設置成功    return SetPwdSuccess;  }  if (![str isEqualToString: [[NSUserDefaults standardUserDefaults]objectForKey:@"pwdValue"]]) {    //二次設置不一樣    return PwdNoValue;  }  return Other;}//清空-(void)clear{  [self.btnsArray removeAllObjects];  self.currentPoint = CGPointZero;  [self setNeedsDisplay];  self.lineColor = [UIColor greenColor];  self.userInteractionEnabled = YES;}//獲取觸摸的點-(CGPoint)getCurrentTouch:(NSSet<UITouch*> *)touches{  UITouch *touch = [touches anyObject];  CGPoint point = [touch locationInView:touch.view];  return point;}-(UIButton *)getCurrentBtnWithPoint:(CGPoint) currentPoint{  for (UIButton *btn in self.subviews) {    if (CGRectContainsPoint(btn.frame, currentPoint)) {      return btn;    }  }  return nil;}-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{  CGPoint point = [self getCurrentTouch:touches];  UIButton *btn = [self getCurrentBtnWithPoint:point];  if (btn && btn.selected != YES) {    btn.selected = YES;    [self.btnsArray addObject:btn];    NSLog(@" array is value %@",self.btnsArray);  }}-(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{  CGPoint movePoint = [self getCurrentTouch:touches];  UIButton *btn = [self getCurrentBtnWithPoint:movePoint];  if (btn && btn.selected !=YES) {    btn.selected = YES;    [self.btnsArray addObject:btn];    NSLog(@"btn is value %@",self.btnsArray);  }  self.currentPoint = movePoint;  [self setNeedsDisplay];}-(void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{  for (UIButton *btn in self.btnsArray) {    [btn setSelected:NO];  }  NSMutableString *result = [NSMutableString string];  for (UIButton *btn in self.btnsArray) {    [result appendString: [NSString stringWithFormat:@"%ld",(long)btn.tag]];  }  switch (Amode) {    case GestureSetPassword:{      //設置手勢密碼      self.setPwdBlock([self pwdValue:result]);    }      break;    case GestureResultPassword :{      //獲取手勢密碼結果      if (self.sendReaultData) {        if (self.sendReaultData(result) == YES) {           NSLog(@"success");          [self clear];        }else{          NSLog(@"手勢有誤");        }      }    }      break;    default:      break;  }  //返回結果  [self clear];}#pragma mark 延時加載-(NSMutableArray *)btnsArray{  if (_btnsArray == nil) {    _btnsArray = [NSMutableArray array];  }  return _btnsArray;}-(NSMutableArray *)allBtnsArray{  if (_allBtnsArray == nil) {    _allBtnsArray = [NSMutableArray array];  }  return _allBtnsArray;}@end

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线播放日韩av| 最新91在线视频| 中文字幕视频在线免费欧美日韩综合在线看| 久久亚洲春色中文字幕| 欧美日韩美女在线观看| 亚洲免费中文字幕| 国内精品模特av私拍在线观看| 亚洲最大成人网色| 国产一区二区三区视频在线观看| 日韩精品中文字幕在线观看| 日本久久中文字幕| 精品国产精品自拍| 欧美性色视频在线| 欧美特黄级在线| 久久久噜噜噜久久中文字免| 一区二区三区久久精品| 亚洲欧美日韩精品久久奇米色影视| 亚洲国产精品推荐| 欧美精品激情在线观看| 久久全国免费视频| 69久久夜色精品国产69| 日本久久中文字幕| 怡红院精品视频| 亚洲欧美日韩天堂一区二区| 深夜精品寂寞黄网站在线观看| 97av视频在线| 亚洲国产美女精品久久久久∴| 欧美大片大片在线播放| 亚洲a∨日韩av高清在线观看| 国产欧美一区二区三区在线看| 性欧美xxxx视频在线观看| 亚洲黄一区二区| 国产日本欧美一区二区三区在线| 永久555www成人免费| 日韩av电影国产| 欧美日韩国产丝袜另类| 国产视频福利一区| 亚洲国产中文字幕在线观看| 国产一区二区美女视频| 中文欧美在线视频| 久久精彩免费视频| 欧美性xxxx极品高清hd直播| 欧美激情视频网址| 欧美专区在线播放| 日韩中文在线观看| 青青草原一区二区| 国产日韩在线看片| 欧美成人精品在线| 亚洲第一色在线| 国产精品视频白浆免费视频| 国产精品福利无圣光在线一区| 成人亚洲综合色就1024| 欧美亚洲成人精品| 91香蕉国产在线观看| 日韩一区视频在线| 欧美视频精品一区| 国产精品高潮呻吟久久av黑人| 欧美日韩亚洲国产一区| 91久久中文字幕| 影音先锋欧美在线资源| 成人免费视频网址| 欧美裸体xxxxx| 国产女人18毛片水18精品| 亚洲人成啪啪网站| 热久久视久久精品18亚洲精品| 国产精品中文久久久久久久| 精品久久久久久久中文字幕| 青草成人免费视频| 亚洲男人7777| 91国在线精品国内播放| 久久久999精品视频| 欧美裸体视频网站| 国产精品久久久久久久久久久久久| 成人免费看吃奶视频网站| 亚洲精品永久免费| 亚洲第一级黄色片| 久久久久久97| 国产欧美日韩亚洲精品| 国产综合福利在线| 欧美极品少妇与黑人| 性色av一区二区咪爱| 久久97久久97精品免视看| 性色av一区二区三区在线观看| 91免费看国产| 欧美精品在线免费观看| 91成人国产在线观看| 欧美国产欧美亚洲国产日韩mv天天看完整| 中文字幕少妇一区二区三区| 亚洲欧美综合区自拍另类| 色综合视频网站| 亚洲视频在线观看视频| 国产精品久久久久久久久久三级| 成人两性免费视频| 高清亚洲成在人网站天堂| 欧美日韩一区二区精品| 日韩一区二区精品视频| 国产精品96久久久久久又黄又硬| 91精品国产综合久久男男| 92版电视剧仙鹤神针在线观看| 欧美中文字幕在线播放| 日韩中文有码在线视频| 久久久久久久一| 第一福利永久视频精品| 久久精品国产精品| 国产精品欧美日韩一区二区| 永久免费看mv网站入口亚洲| 亚洲欧美中文另类| 91亚洲国产成人久久精品网站| 国语自产精品视频在线看| 亚洲国产精品国自产拍av秋霞| 日韩免费中文字幕| 亚洲男人天堂2019| 日韩精品在线免费观看视频| 日韩中文字幕网| 日韩av电影在线免费播放| 国产97在线|日韩| 亚洲美女免费精品视频在线观看| 国产精品18久久久久久麻辣| 久久香蕉频线观| 国产精品88a∨| 亚洲午夜久久久久久久| 国产精品91在线| 欧美在线视频a| 久久亚洲精品一区| 亚洲www视频| 久久国产精品久久久久久| 成人疯狂猛交xxx| 国产精品va在线播放我和闺蜜| 久久精品一本久久99精品| 91九色综合久久| 久久久国产精品免费| 色无极影院亚洲| 亚洲品质视频自拍网| 91sao在线观看国产| 欧美日韩国产精品一区| 亚洲日韩欧美视频| 欧美亚洲国产成人精品| 国产精品视频免费在线观看| 亚洲第一福利在线观看| 久久青草精品视频免费观看| 亚洲精品国产成人| 日韩av高清不卡| 国产精品国产三级国产aⅴ浪潮| 亚洲国产美女精品久久久久∴| 国产精品高潮视频| 亚洲国产精品女人久久久| 日韩av黄色在线观看| 69av在线视频| 久久久999成人| 色噜噜狠狠狠综合曰曰曰| 国产香蕉一区二区三区在线视频| 国产精品久久久久免费a∨大胸| 精品国产91久久久| 日韩欧美一区二区三区| 日韩电影视频免费| 久久69精品久久久久久国产越南| 精品视频久久久久久| 久久精品国产69国产精品亚洲| 综合欧美国产视频二区| 一区二区三区视频在线| 91精品一区二区| 亚洲国产欧美日韩精品| …久久精品99久久香蕉国产| 欧美体内谢she精2性欧美|