iOS实现手势解锁操作_IOS

本文主要介绍通过手势识别实现手势解锁功能,这个方法被广泛用于手机解锁,密码验证,快捷支付等功能实现。事例效果如下所示。

 首先,我们先分析功能的实现过程,首先我们需要先看大致的实现过程:

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]
                                   }];

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索iOS手势解锁
iOS手势
ios 手势解锁、ios手势解锁第三方库、ios 手势密码解锁demo、ios 手势解锁demo、ios手势实现连点,以便于您获取更多的相关知识。

时间: 2024-09-24 09:22:40

iOS实现手势解锁操作_IOS的相关文章

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

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

iOS开发之手势识别实例_IOS

感觉有必要把iOS开发中的手势识别做一个小小的总结.下面会先给出如何用storyboard给相应的控件添加手势,然后在用纯代码的方式给我们的控件添加手势,手势的用法比较简单.和button的用法类似,也是目标 动作回调,话不多说,切入今天的正题. 总共有六种手势识别:轻击手势(TapGestureRecognizer),轻扫手势 (SwipeGestureRecognizer), 长按手势(LongPressGestureRecognizer),  拖动手势(PanGestureRecogniz

Android NavigationController 右滑手势详解_IOS

苹果一直都在人机交互中尽力做到极致,在iOS7中,新增加了一个小小的功能,也就是这个api:self.navigationController.interactivePopGestureRecognizer.enabled = YES; 这个api功能就是在NavigationController堆栈内的UIViewController可以支持右滑手势,也就是不用点击右上角的返回按钮,轻轻在屏幕左边一滑,屏幕就会返回,随着ios设备屏幕的增大,这个小功能让手指短,拇指大和手残人士看到了福音. 这

微信小程序开发实战教程之手势解锁_javascript技巧

代码:https://github.com/jsongo/wx-gesture-lock 这个手势解锁的demo使用了https://github.com/lvming6816077/H5lock 这个项目的算法和主逻辑,整合到微信小程序来,修改了很多地方的语法来适配小程序,去掉了window.document等函数,同时也添加了新的机制来解耦界面的操作和第三方库,这个下面会介绍到. 不过可惜的是,这个demo也只能在开发工具上玩玩,到真机上测试的时候,手指一滑动,页面会跟着滚动,手势没法使用.

ios-app 从后台进入前台 显示手势解锁状态怎么弄

问题描述 app 从后台进入前台 显示手势解锁状态怎么弄 iOS 的,想从后台进入前台时直接显示解锁状态,这个我上新手,问这个问题不知道会不会显得很无知 解决方案 我连ios都不会.... 解决方案二: 你是要系统的指纹解锁么? 解决方案三: (void)applicationWillEnterForeground:(UIApplication *)application 这个方法里写解锁相关

在Visual Studio 2013/2015上使用C#开发Android/IOS安装包和操作步骤

原文:在Visual Studio 2013/2015上使用C#开发Android/IOS安装包和操作步骤 Xamarin 配置手册和离线包下载  http://pan.baidu.com/s/1eQ3qw8a 具体操作: 安装前提条件 1. 安装Visual Studio 2013,安装过程省略,我这里安装的windows10 + vs2013 with update 4. 2. 安装Java SDK,按照Next一步步安装,此处省略,如下图: 3. 安装Android SDK:因为在线安装的

方法-IOS 触摸 手势和tableView cell的点击冲突

问题描述 IOS 触摸 手势和tableView cell的点击冲突 刚开始 书写的方法 // 触摸 (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { //取出touches集合元素 UITouch *touch = [touches anyObject]; NSLog(@"%@", touch); CGPoint point = [touch locationInView:self.view]; // 打

求大神告诉我手势解锁范围怎么去设置

问题描述 求大神告诉我手势解锁范围怎么去设置 求大神指教,我用的是通用的九宫格手势解锁,怎么样才能扩大我每个点的接受范围呢?????急急急 ,求指教. 解决方案 手势解锁代码实现CYC- 手势解锁

触控-关于手势解锁时的范围问题

问题描述 关于手势解锁时的范围问题 在解锁的时候怎么样能让画笔的路径扩大一点,更容易点到点上,或者怎么样让触控更灵敏,我现在的程序触控范围有点小