iOS仿邮箱大师的九宫格手势密码解锁

本文实例为大家分享了iOS手势密码解锁的相关代码,供大家参考,具体内容如下

//
// 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;
/** 当前触摸点 */
@property(nonatomic, assign) CGPoint curp;
@end

@implementation LockView

- (NSMutableArray *)selectedBtn {
  if (_selectedBtn == nil) {
    _selectedBtn = [NSMutableArray array];
  }
  return _selectedBtn;
}

- (IBAction)pan:(UIPanGestureRecognizer *)pan {

  //获取当前触摸点
  _curp = [pan locationInView:self];

  //判断触摸点在不在按钮上
  for (UIButton *btn in self.subviews) {
    //如果在按钮上就设置选中状态

    //触摸点必须在button中心点30范围内才选中,更精确,体验更好
    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];

    }
  }

  //重绘,调用drawRect方法
  [self setNeedsDisplay];

  //手指抬起时
  if(pan.state == UIGestureRecognizerStateEnded) {

    NSMutableString *strM = [NSMutableString string];

    //如果当前触摸点不在Button上,则手指抬起时,就显示选中的Button以及连线
    UIButton *lastBtn = [self.selectedBtn lastObject];

    //把最后一个选中按钮的中心点设置为当前触摸点,清除最后多出来的一截连线
    _curp = lastBtn.center;

    for (UIButton *btn in self.selectedBtn) {
      //保存手势密码
      [strM appendFormat:@"%ld", btn.tag];
    }

    //strM就是密码了
    NSLog(@"%@",strM);

    //TODO:对比之前保存的密码,如果对了就直接跳转界面了

    //NSLog(@"手指抬起");
    //这里了执行完之后系统自动调用了重绘方法

    //等待2s后清除所有连线,清除Button的选中状态
    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];这句不知道为啥没有效果,只好用循环了
      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];

  //把所有点都连完线
  for (int i = 0; i < count; i++) {
    UIButton * btn = self.selectedBtn[i];
    if (i == 0) {
      //如果是第一个点,就设置为起点
      [path moveToPoint:btn.center];
    }else {
      //添加连线
      [path addLineToPoint: btn.center];
    }
  }

  //画最后一个点到手指触摸点之间的线
  [path addLineToPoint:_curp];

  [[UIColor greenColor]set];
  path.lineJoinStyle = kCGLineJoinRound;
  path.lineWidth = 8;
  [path stroke];

}

- (void)awakeFromNib {

  //创建9个按钮
  for (int i = 0; i < 9; i++) {
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];

    //不允许与用户交互,也就是点击事件不作处理
    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;
  //列数
  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];

    //计算当前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

效果图:

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

(0)

相关推荐

  • iOS实现手势解锁操作

    本文主要介绍通过手势识别实现手势解锁功能,这个方法被广泛用于手机解锁,密码验证,快捷支付等功能实现.事例效果如下所示. 首先,我们先分析功能的实现过程,首先我们需要先看大致的实现过程: 1.加载九宫格页面 2.实现按钮被点击及滑动过程中按钮状态的改变 3.实现滑动过程中的连线 4.绘制完毕后判定密码是否正确, 5.密码判定后实现跳转. 下面我们就来用代码实现上述五个过程. 1.加载九宫格界面 1.1九宫格内控件的分布 3*3 ,我们可以自定义view(包含3*3个按钮),添加到viewContr

  • iOS实现手势滑动解锁功能简析

    题记 在平常的生活中,我们大概经常遇见手势滑动解锁---也就是九宫格啊,已经出现好久了,虽然随着Apple的指纹解锁的发展手势解锁虽然还有但是因为其不如指纹解锁方便也用的也少了,但是在大多数APP中这两种方式都是并存的,比如qq,微信,支付宝等等,最近项目里面也刚好有这个需求,趁着刚完成抽出时间来记录下来当时的一些思路,可能有的地方理解的不到位,还需多总结,闲言少叙了,看重点. 功能描述如图:大概说一下思路,这个功能用来做相当于密令,用于两端的匹配,教师端设置了路径生成密码,储存在本地,学生端用

  • 使用Swift代码实现iOS手势解锁、指纹解锁实例详解

    一.手势密码 1. 1.1.用UIButton组成手势的节点. 1.2.当手指接触屏幕时,调用重写的 touchesBegan:withEvent方法(在touchesBegan里调用setNeedsDisplay,这样就会自动调用drawRect方法). 1.3.当手指在屏幕上滑动时,调用重写的touchesEnded:withEvent方法. 这两个方法执行的操作是一样的:通过locationInView获取 触摸的坐标,然后用 CGRectContainsPoint 判断手指是否经过UIB

  • iOS仿邮箱大师的九宫格手势密码解锁

    本文实例为大家分享了iOS手势密码解锁的相关代码,供大家参考,具体内容如下 // // LockView.m // 手势解锁 // // Created by Daniel on 16/4/4. // Copyright © 2016年 Daniel. All rights reserved. // #import "LockView.h" @interface LockView () /** 保存已选中的按钮 */ @property(nonatomic, strong) NSMut

  • Android自定义View九宫格手势密码解锁

    由于公司新的项目需要用到九宫格手势密码解锁的功能,于是觉得自己写一个.废话不多说,直接上效果图: 首选我们来分析下实现的思路: 1. 绘制出相对于这个View的居中的九个点,作为默认状态的点 2. 点击屏幕的时候是否点击在这九个点上 3. 在屏幕上滑动的时候,绘制两个点之间的线条,以及选中状态的点 4. 手指离开屏幕的时候判断手势密码是否正确,如若错误这把错误状态下的点和线绘制出来. 具体实现: 首先我们得绘制出默认正常状态下的九个点: /** * 点的bean * Created by Adm

  • 纯android代码实现九宫格手势密码

    这几天项目中要加九宫格手势密码,在网上搜了大量资料,大部分都是以图片实现为主,集合部分代码,android实现纯代码九宫格. 好了,不废话了,先上图. 效果大概就是这样,逻辑自己实现,我只上这个自定义控件的代码. 1.    point.Java  点的位置 /** * 点位置 */ public class Point { public static int STATE_NORMAL = 0; public static int STATE_CHECK = 1; // public stati

  • Android实现九宫格手势密码

    本文实例为大家分享了vue + element ui实现锚点定位的具体代码,供大家参考,具体内容如下 介绍下自己编写的九宫格手势密码.先见图 思路:首先是9个格子,接着是格子连线:那么我们的步骤就有了. 1.手势监听,进行连线2.格子的状态未连接(初始状态).已连接的(没有结果前).错误状态(有结果后).(先这三个,可扩展,比如按下状态)3.自定义viewgroup作为九宫格的容器,里面包含9个view(小格子) 一.先从简单的说起吧,9个小格子以及状态 为了扩展性,不自定义view,将三个状态

  • Android仿支付宝手势密码解锁功能

    Starting 创建手势密码可以查看 CreateGestureActivity.java 文件. 登陆验证手势密码可以看 GestureLoginActivity.java 文件. Features 使用了 JakeWharton/butterknife butterknife 使用了 ACache 来存储手势密码 /** * 保存手势密码 */ private void saveChosenPattern(List<LockPatternView.Cell> cells) { byte[

  • Android九宫格手势密码代码设计

    最近因为项目需要用到九宫格密码(也叫手势轨迹密码),特地去学习了一下九宫格密码的实现原来.可能有人认为九宫格密码事例网上到处都有,很多甚至直接拷贝过来就可以运行为什么还要学习呢.还特地写到网上有必要吗?其实写这个目的是为了增强和锻炼自己的语言组织能力.其实如果只是既然是学习就不光是要知道答案(完成效果)更重要的是知道他什么实现. 好了题外话就不多说了,要实现九宫格密码要解决的问题有: 1.给九宫格密码界面布局九个点,即确定每个节点的位置.每个点到上下左右的距离都是相同的.即九个点刚好围成一个正方

  • Android 简易手势密码开源库详解

    简介 本文介绍一个Android手势密码开源库的使用及实现的详细过程,该开源库主要实现以下几个功能: 支持手势密码的绘制,并支持密码保存功能,解锁时自动比对密码给出结果 封装了绘制密码的方法,比对两次密码是否一致,可以快捷地进行手势密码的设置 可以设置密码输入错误后的重试次数上限 可以自定义不同状态下手势密码图案的颜色 可以自定义手势密码的触摸点数量(n*n) 最近需要用到手势密码解锁功能,找了一些demo感觉用起来都有点麻烦,于是参考一些文章自己造了下轮子,封装了相关的一些方法,使用起来比较便

  • js+html5实现手机九宫格密码解锁功能

    HTML5真的是很强大,前端时间看到一个canvas实现九宫格的密码解锁.今天抽出时间模仿了一个,特定分享一下! 效果截图如下: 效果看起来还不错吧! 源码如下: <!DOCTYPE html> <html> <head lang="zh-CN"> <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"

  • android 仿ios数字密码解锁界面的实例

    如下所示: 每个Android开发人员都知道,现在android的解锁最常用的就是九宫格解锁,ios的解锁常用的是数字密码解锁.而我们在开发工程中,很多时候,都需要android和ios进行结合.有的时候我们就需要把我们的解锁界面弄成像ios一样的数字键盘. 这里我就实现了一个仿照ios的数字密码解锁界面.在这里我采用了两种方式来实现,第一种就是使用自定义控件的形式,第二种就是使用我们的布局来实现的.这里我就着重讲一下使用自定义控件形式实现的思路.至于使用布局文件实现的方式,我就不进行具体的讲解

  • iOS实现手势密码功能

    手势密码实现 手势密码 一般常常用于金融项目,做的是安全相关的业务.具体实现如下思路,我把它分为view层和逻辑层.我将数据层合并到view层中了,最好是加上数据层用于处理加密的密码和密码的存储 view层 view层主要处理,包括(九个按钮)touchesBegan,touchesMoved,touchesEnded,点与点之间画线,手指滑动画线,画线主要是在drawRect中重绘,提到这里必须不能忘记setNeedsDisplay这个方法.还要记录经过的按钮btnsArray(存放按钮的数组

随机推荐