iOS动态验证码实现代码

具体代码如下所示:

//
// AuthcodeView.h
// BSbracelet
//
// Created by Christopher on 17/5/16.
// Copyright © 2017年 ZTracy. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface AuthcodeView : UIView
@property (strong, nonatomic) NSArray *dataArray;//字符素材数组
@property (strong, nonatomic) NSMutableString *authCodeStr;//验证码字符串
@end
//
// AuthcodeView.m
// BSbracelet
//
// Created by Christopher on 17/5/16.
// Copyright © 2017年 ZTracy. All rights reserved.
//
#import "AuthcodeView.h"
#define kRandomColor [UIColor colorWithRed:arc4random() % 256 / 256.0 green:arc4random() % 256 / 256.0 blue:arc4random() % 256 / 256.0 alpha:1.0];
#define kLineCount 6
#define kLineWidth 1.0
#define kCharCount 4
#define kFontSize [UIFont systemFontOfSize:arc4random() % 5 + 15]
@implementation AuthcodeView
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
  // Drawing code
}
*/
- (instancetype)initWithFrame:(CGRect)frame
{
  self = [super initWithFrame:frame];
  if (self)
  {
    self.layer.cornerRadius = 5.0f;
    self.layer.masksToBounds = YES;
    self.backgroundColor = kRandomColor;
    [self getAuthcode];//获得随机验证码
  }
  return self;
}
#pragma mark 获得随机验证码
- (void)getAuthcode
{
  //字符串素材
  _dataArray = [[NSArray alloc] initWithObjects:@"0",@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"A",@"B",@"C",@"D",@"E",@"F",@"G",@"H",@"I",@"J",@"K",@"L",@"M",@"N",@"O",@"P",@"Q",@"R",@"S",@"T",@"U",@"V",@"W",@"X",@"Y",@"Z",@"a",@"b",@"c",@"d",@"e",@"f",@"g",@"h",@"i",@"j",@"k",@"l",@"m",@"n",@"o",@"p",@"q",@"r",@"s",@"t",@"u",@"v",@"w",@"x",@"y",@"z",nil];
  _authCodeStr = [[NSMutableString alloc] initWithCapacity:kCharCount];
  //随机从数组中选取需要个数的字符串,拼接为验证码字符串
  for (int i = 0; i < kCharCount; i++)
  {
    NSInteger index = arc4random() % (_dataArray.count-1);
    NSString *tempStr = [_dataArray objectAtIndex:index];
    _authCodeStr = (NSMutableString *)[_authCodeStr stringByAppendingString:tempStr];
  }
}
#pragma mark 点击界面切换验证码
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
  [self getAuthcode];
  //setNeedsDisplay调用drawRect方法来实现view的绘制
  [self setNeedsDisplay];
}
- (void)drawRect:(CGRect)rect
{
  [super drawRect:rect];
  //设置随机背景颜色
  self.backgroundColor = kRandomColor;
  //根据要显示的验证码字符串,根据长度,计算每个字符串显示的位置
  NSString *text = [NSString stringWithFormat:@"%@",_authCodeStr];
  CGSize cSize = [@"A" sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:20]}];
  int width = rect.size.width/text.length - cSize.width;
  int height = rect.size.height - cSize.height;
  CGPoint point;
  //依次绘制每一个字符,可以设置显示的每个字符的字体大小、颜色、样式等
  float pX,pY;
  for ( int i = 0; i<text.length; i++)
  {
    pX = arc4random() % width + rect.size.width/text.length * i;
    pY = arc4random() % height;
    point = CGPointMake(pX, pY);
    unichar c = [text characterAtIndex:i];
    NSString *textC = [NSString stringWithFormat:@"%C", c];
    [textC drawAtPoint:point withAttributes:@{NSFontAttributeName:kFontSize}];
  }
  //调用drawRect:之前,系统会向栈中压入一个CGContextRef,调用UIGraphicsGetCurrentContext()会取栈顶的CGContextRef
  CGContextRef context = UIGraphicsGetCurrentContext();
  //设置线条宽度
  CGContextSetLineWidth(context, kLineWidth);
  //绘制干扰线
  for (int i = 0; i < kLineCount; i++)
  {
    UIColor *color = kRandomColor;
    CGContextSetStrokeColorWithColor(context, color.CGColor);//设置线条填充色
    //设置线的起点
    pX = arc4random() % (int)rect.size.width;
    pY = arc4random() % (int)rect.size.height;
    CGContextMoveToPoint(context, pX, pY);
    //设置线终点
    pX = arc4random() % (int)rect.size.width;
    pY = arc4random() % (int)rect.size.height;
    CGContextAddLineToPoint(context, pX, pY);
    //画线
    CGContextStrokePath(context);
  }
}
@end
使用
-(void)recordBtnClick:(UIButton *)recordBtn
{
  DomodelView = [[UIView alloc]initWithFrame:CGRectMake(0,0,kScreenWidth,kScreenHeight)];
  DomodelView.backgroundColor = [UIColor colorWithRed:0.3 green:0.3 blue:0.3 alpha:0.6];
  authBgview = [[UIView alloc]initWithFrame:CGRectMake(30, 120, self.view.frame.size.width-60, 220)];
  authBgview.backgroundColor = [UIColor whiteColor]; //显示验证码界面
  authBgview.layer.cornerRadius = 8;
  authBgview.layer.masksToBounds = YES;
  authCodeView = [[AuthcodeView alloc] initWithFrame:CGRectMake(10, 10, kScreenWidth-80, 45)];
  [authBgview addSubview:authCodeView];
    //提示文字
  UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10, 65, kScreenWidth-80, 40)];
  label.text = @"点击图片换验证码";
  label.font = [UIFont systemFontOfSize:15];
  label.textColor = [UIColor grayColor];
  [authBgview addSubview:label];
  //添加输入框
  _input = [[UITextField alloc] initWithFrame:CGRectMake(10, 120, kScreenWidth-80, 40)];
  _input.layer.borderColor = [UIColor lightGrayColor].CGColor;
  _input.layer.borderWidth = 2.0;
  _input.layer.cornerRadius = 5.0;
  _input.font = [UIFont systemFontOfSize:21];
  _input.placeholder = @"请输入验证码!";
  _input.clearButtonMode = UITextFieldViewModeWhileEditing;
  _input.backgroundColor = [UIColor clearColor];
  _input.textAlignment = NSTextAlignmentCenter;
  _input.returnKeyType = UIReturnKeyDone;
  _input.delegate = self;
  [authBgview addSubview:_input];
  UIButton *closeBtn = [[UIButton alloc] initWithFrame:CGRectMake(10,170, kScreenWidth-80, 40)];
  [closeBtn addTarget:self action:@selector(removeview) forControlEvents:UIControlEventTouchUpInside];
  closeBtn.backgroundColor = RGBCOLOR(34,151,216);
  [closeBtn setTitle: @"关闭" forState: UIControlStateNormal];
  [authBgview addSubview:closeBtn];
  [DomodelView addSubview:authBgview];
   [self.view addSubview:DomodelView];
//  InvoiceRecordViewController *InvoiceRecordVc = [[InvoiceRecordViewController alloc] initWithNibName:@"InvoiceRecordViewController" bundle:nil];
//  [self.navigationController pushViewController:InvoiceRecordVc animated:YES];
}
#pragma mark 输入框代理,点击return 按钮
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
  //判断输入的是否为验证图片中显示的验证码
  if([_input.text compare:authCodeView.authCodeStr options:NSCaseInsensitiveSearch |NSNumericSearch] ==NSOrderedSame)
  {
    //正确弹出警告款提示正确
    //    UIAlertView *alview = [[UIAlertView alloc] initWithTitle:@"恭喜您 ^o^" message:@"验证成功" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
    //    [alview show];
    [DomodelView removeFromSuperview];
    InvoiceRecordViewController *InvoiceRecordVc = [[InvoiceRecordViewController alloc] initWithNibName:@"InvoiceRecordViewController" bundle:nil];
    [self.navigationController pushViewController:InvoiceRecordVc animated:YES];
  }
  else
  {
    //验证不匹配,验证码和输入框抖动
    CAKeyframeAnimation *anim = [CAKeyframeAnimation animationWithKeyPath:@"transform.translation.x"];
    anim.repeatCount = 1;
    anim.values = @[@-20,@20,@-20];
    //    [authCodeView.layer addAnimation:anim forKey:nil];
    [_input.layer addAnimation:anim forKey:nil];
  }
  return YES;
}

总结

以上所述是小编给大家介绍的iOS动态验证码实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

您可能感兴趣的文章:

  • iOS本地动态生成验证码的方法
  • 利用iOS绘制图片生成随机验证码示例代码
  • iOS滑动解锁、滑动获取验证码效果的实现代码
  • IOS中快速集成短信SDK验证开发(SMSSDK),IOS开发中如何设置手机短信验证码
  • IOS实现输入验证码、密码按位分割(二)
  • IOS实现验证码倒计时功能(一)
(0)

相关推荐

  • IOS中快速集成短信SDK验证开发(SMSSDK),IOS开发中如何设置手机短信验证码

    嘿嘿..sdk是别人的,我只是下载来集成一下. smssdk下载网站:http://www.mob.com/(也有其他很多网站有类似SDK,譬如https://www.juhe.cn/等等,可以自行百度,我在这里就演示一下MOB官网的) 此网站号称smssdk免费,可是进去一看........ 每天免费20条,上限登记了才永久免费.不多说了,开始...... 官网集成文档http://wiki.mob.com/ [1~3步]我就截图官方文档了,傻瓜式操作 [4.1]:先看官网说明: [4.2]再

  • 利用iOS绘制图片生成随机验证码示例代码

    先来看看效果图 实现方法 .h文件 @property (nonatomic, retain) NSArray *changeArray; @property (nonatomic, retain) NSMutableString *changeString; @property (nonatomic, retain) UILabel *codeLabel; -(void)changeCode; @end .m文件 @synthesize changeArray = _changeArray;

  • IOS实现输入验证码、密码按位分割(二)

    本文提供了实现IOS实现输入验证码.密码按位分割的一种思路,分享给大家供大家参考,希望与大家共同交流. 一.实现思路 1.思路描述 自定义一个view,继承自UIView 在view中添加子控件textField,backgroundImageView,label 将验证码/密码的内容绘制到label的指定区域(计算得到),所以label要自定义,在drawRect方法中绘制验证码 使用一个属性secureTextEntry,来控制显示验证码(显示真实的数字)或密码(显示圆点) 2.视图中的子控

  • IOS实现验证码倒计时功能(一)

    验证码倒计时按钮的应用是非常普遍的,该Blog就和你一起来写一个IDCountDownButton来实现验证码倒计时的效果.你可以想使用普通的UIButton类型按钮一样,只需要设置其倒计时时长(若未设置,默认为60秒),就可以轻松的实现点击countDownButton开始倒计时,倒计时结束方可重新点击. 一.实现效果 如图 二.实现思路 1.自定义一个IDCountDownButton,重写 beginTrackingWithTouch:withEvent: 拦截button的点击事件,根据

  • iOS本地动态生成验证码的方法

    前几天app注册被人攻击了,从网上找了这个先保存下.... 用于ios本地动态生成验证码,效果如下: 导入CoreGraphics.framework 用于绘制图形 封装UIView,便捷使用,代码如下: AuthcodeView.h #import <UIKit/UIKit.h> @interface AuthcodeView : UIView @property (strong, nonatomic) NSArray *dataArray;//字符素材数组 @property (stron

  • iOS滑动解锁、滑动获取验证码效果的实现代码

    最近短信服务商要求公司的app在获取短信验证码时加上校验码,目前比较流行的是采用类似滑动解锁的方式,我们公司采取的就是这种方式,设计图如下所示: 这里校验内部的处理逻辑不作介绍,主要分享一下界面效果的实现, 下面贴出代码: 先子类化UISlider #import <UIKit/UIKit.h> #define SliderWidth 240 #define SliderHeight 40 #define SliderLabelTextColor [UIColor colorWithRed:1

  • iOS动态验证码实现代码

    具体代码如下所示: // // AuthcodeView.h // BSbracelet // // Created by Christopher on 17/5/16. // Copyright © 2017年 ZTracy. All rights reserved. // #import <UIKit/UIKit.h> @interface AuthcodeView : UIView @property (strong, nonatomic) NSArray *dataArray;//字符

  • PHP 动态随机生成验证码类代码

    下面是效果图,这个效果图是没有开启干扰码的效果图 下面是类代码 复制代码 代码如下: <?php /************************************************ //FILE:ImageCode //DONE:生成动态验证码类 //DATE"2010-3-31 //Author:www.5dkx.com 5D开心博客 *********************************************************************

  • Struts2实现生成动态验证码并验证实例代码

     一.基本流程: 产生一个验证码页面(很小)→嵌入到表单中→点击可以刷新页面→表单提交时验证. 二.方法: 1.定义TestAction,实现画图方法 package com.zhuguang.action; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.util.Map; import javax.se

  • python通过pillow识别动态验证码的示例代码

    目录 环境配置  安装 pillow(PIL)库 识别过程 生活中,我们在登录微博,邮箱的时候,常常会碰到验证码.在工作时,如果想要爬取一些数据,也会碰到验证码的阻碍.本次试验将带领大家认识验证码的一些特性,并利用 Python 中的 pillow 库完成对验证码的破解. 环境配置 Python 2.7 Pillow 模块 有个问题就是python2.7目前只能让使用到2020年,现在再利用2.7下载好多东西都会报错,也该是时候更新到python3.7了,本文还是依赖于2.7的环境. 识别验证码

  • iOS获取验证码倒计时效果

    本文实例为大家分享了iOS倒计时获取验证码的具体代码,供大家参考,具体内容如下 1. 倒计时发送验证码,界面跳转计时会重置 /**重新发送短信的计时*/ -(void)fireTimer{ __block int timeout=180; //倒计时时间 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_source_t _timer = dispatc

  • js点击文本框后才加载验证码实例代码

    经常到各大网站去留言或者发帖的朋友应该知道现在很多网站的留言地方的验证码不是直接显示的.而是在点击验证码输入框之后才会显示出来验证码的.下面作者也总结了一篇关于如何利用js实现点击文本框然后再加载验证码的效果的. 废话不多说了,下面是具体的实现代码. <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title

  • 12306动态验证码启发之ASP.NET实现动态GIF验证码(附源码)

    12306网站推出"彩色动态验证码机制",新版验证码不但经常出现字符叠压,还不停抖动,不少人大呼"看不清",称"那个验证码,是毕加索的抽象画么!"铁总客服则表示:为了能正常购票只能这样.而多家抢票软件接近"报废",引发不少网友不满的吐槽称"太抽象太艺术了". 以前做项目有时候也会用到验证码,但基本都是静态的,这次也想凑凑12306的热闹.闲言少续,切入正题,先上代码. 实现方法: public void S

  • java Servlet 实现动态验证码图片示例

    整理文档,搜刮出一个java Servlet 实现动态验证码图片的代码,稍微整理精简一下做下分享. package com.hacker; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; i

  • 基于C#实现12306的动态验证码变成静态验证码的方法

    本以为这次12306的动态验证码很厉害,什么刷票软件都不行了,看了以后发现并不是很复杂,估计不出两日刷票软件又会卷土重来,开来要一个验证码很难遏制这些刷票软了. 这次换的动态验证码采用的是GIF格式在客户端输出,至于要拿到这个gif文件然后把动态图的各张图片拼凑起来就能得到完整的静态验证码,接下来就是识别静态验证码的事情了. 比如这张动态验证码 他的静态效果就是 下面是随手写的代码,有点混乱 Image imgGif = Image.FromFile(Application.StartupPat

  • iOS 输入验证码或密码,自动下一位的实例

    系统没有textFeild 的相关当输入内容改变时候的代理方法...所以我们自己加一个监听来实现如下的效果 自动跳转下一位 主要代码如下: [_code1F becomeFirstResponder]; [_code1F addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; [_code2F addTarget:self action:@select

随机推荐