全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

iOS实现手势密码功能

手势密码实现

手势密码 一般常常用于金融项目,做的是安全相关的业务。具体实现如下思路,我把它分为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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# iOS  # 手势密码  # IOS开发笔记之禁用手势滑动返回功能的示例  # IOS中多手势之间的冲突和解决办法  # iOS 用Swipe手势和动画实现循环播放图片示例  # 利用iOS手势与scrollView代理实现图片的放大缩小  # IOS中的七种手势小结  # IOS开发之手势响应事件优先级的实例详解  # 解锁  # 画线  # 清空  # 的是  # 是在  # 点这里  # 已有  # 把它  # 可以直接  # 我将  # 中了  # 提供给  # 回调  # 才来  # 大家多多  # 并到  # 加载  # 九宫格  # str  # void 


相关文章: 如何用好域名打造高点击率的自主建站?  焦点电影公司作品,电影焦点结局是什么?  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  高防服务器如何保障网站安全无虞?  广州商城建站系统开发成本与周期如何控制?  宝塔面板如何快速创建新站点?  Java解压缩zip - 解压缩多个文件或文件夹实例  ,南京靠谱的征婚网站?  微信小程序制作网站有哪些,微信小程序需要做网站吗?  网站制作难吗安全吗,做一个网站需要多久时间?  威客平台建站流程解析:高效搭建教程与设计优化方案  如何通过云梦建站系统实现SEO快速优化?  建站之星后台管理如何实现高效配置?  浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?  建站之星伪静态规则如何正确配置?  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  c# 服务器GC和工作站GC的区别和设置  公司门户网站制作流程,华为官网怎么做?  如何快速辨别茅台真假?关键步骤解析  如何快速搭建高效可靠的建站解决方案?  潮流网站制作头像软件下载,适合母子的网名有哪些?  建站之星IIS配置教程:代码生成技巧与站点搭建指南  如何通过cPanel快速搭建网站?  如何快速搭建高效服务器建站系统?  如何用PHP快速搭建CMS系统?  建站主机类型有哪些?如何正确选型  建站之星各版本价格是多少?  如何快速查询网址的建站时间与历史轨迹?  建站之星下载版如何获取与安装?  番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?  建站之星与建站宝盒如何选择最佳方案?  如何快速搭建安全的FTP站点?  如何通过网站建站时间优化SEO与用户体验?  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  建站之星安装模板失败:服务器环境不兼容?  如何快速打造个性化非模板自助建站?  小型网站制作HTML,*游戏网站怎么搭建?  建站之星导航如何优化提升用户体验?  实现虚拟支付需哪些建站技术支撑?  C++时间戳转换成日期时间的步骤和示例代码  孙琪峥织梦建站教程如何优化数据库安全?  郑州企业网站制作公司,郑州招聘网站有哪些?  如何用虚拟主机快速搭建网站?详细步骤解析  广州美橙建站如何快速搭建多端合一网站?  智能起名网站制作软件有哪些,制作logo的软件?  定制建站流程步骤详解:一站式方案设计与开发指南  javascript基本数据类型及类型检测常用方法小结  已有域名和空间如何快速搭建网站?  建站之星如何优化SEO以实现高效排名?  高防服务器租用首荐平台,企业级优惠套餐快速部署 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。