【iOS】使用UIView绘制本地验证码

记录一笔:

绘制本地验证码View的一个Demo源码:(出处:http://www.cnblogs.com/jerehedu/p/4527707.html)

.h文件的代码:

1 #import <UIKit/UIKit.h>
2
3 @interface AuthCodeView : UIView
4
5 @property (nonatomic, retain) NSMutableString *changeString;  //验证码的字符串
6 @end

.m文件的代码:

  1 #import "AuthCodeView.h"
  2
  3 #define kRandomColor  [UIColor colorWithRed:arc4random() % 256 / 255.0 green:arc4random() % 256 / 255.0 blue:arc4random() % 256 / 255.0 alpha:1.0];
  4 #define kLineCount 6
  5 #define kLineWidth 1.0
  6 #define kCharCount 4
  7 #define kFontSize [UIFont systemFontOfSize:arc4random() % 5 + 18]
  8
  9 @implementation AuthCodeView
 10 @synthesize changeString;
 11
 12 - (instancetype)initWithFrame:(CGRect)frame
 13 {
 14     if (self = [super initWithFrame:frame]) {
 15
 16         self.layer.cornerRadius = 5.0; //设置layer圆角半径
 17         self.layer.masksToBounds = YES; //隐藏边界
 18         self.backgroundColor = kRandomColor;
 19
 20         //显示一个随机验证码
 21         [self refreshCode];
 22     }
 23
 24     return self;
 25 }
 26 #pragma mark 更换验证码,得到更换的验证码的字符串
 27 -(void)refreshCode {
 28     //从字符数组中随机抽取相应数量的字符,组成验证码字符串
 29     NSArray *changeArray = [[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",nil];
 30
 31     //如果能确定最大需要的容量,使用initWithCapacity:来设置,好处是当元素个数不超过容量时,添加元素不需要重新分配内存
 32     NSMutableString *getStr = [[NSMutableString alloc] initWithCapacity:kCharCount];
 33     self.changeString = [[NSMutableString alloc] initWithCapacity:kCharCount];
 34
 35     //随机从数组中选取需要个数的字符,然后拼接为一个字符串
 36     for(int i = 0; i < kCharCount; i++)
 37     {
 38         NSInteger index = arc4random() % ([changeArray count] - 1);
 39         getStr = [changeArray objectAtIndex:index];
 40
 41         self.changeString = (NSMutableString *)[self.changeString stringByAppendingString:getStr];
 42     }
 43 }
 44
 45 #pragma mark 点击view时调用,因为当前类自身就是UIView,点击更换验证码可以直接写到这个方法中,不用再额外添加手势
 46 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
 47 {
 48     //点击界面,切换验证码
 49     [self refreshCode];
 50
 51     //setNeedsDisplay调用drawRect方法来实现view的绘制
 52     [self setNeedsDisplay];
 53 }
 54
 55 #pragma mark 绘制界面(1.UIView初始化后自动调用; 2.调用setNeedsDisplay方法时会自动调用)
 56 - (void)drawRect:(CGRect)rect {
 57     // 重写父类方法,首先要调用父类的方法
 58     [super drawRect:rect];
 59
 60     //设置随机背景颜色
 61     self.backgroundColor = kRandomColor;
 62
 63     //获得要显示验证码字符串,根据长度,计算每个字符显示的大概位置
 64     NSString *text = [NSString stringWithFormat:@"%@",self.changeString];
 65     CGSize cSize = [@"S" sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:20]}];
 66     int width = rect.size.width / text.length - cSize.width;
 67     int height = rect.size.height - cSize.height;
 68     CGPoint point;
 69
 70     //依次绘制每一个字符,可以设置显示的每个字符的字体大小、颜色、样式等
 71     float pX, pY;
 72     for (int i = 0; i < text.length; i++)
 73     {
 74         pX = arc4random() % width + rect.size.width / text.length * i;
 75         pY = arc4random() % height;
 76         point = CGPointMake(pX, pY);
 77         unichar c = [text characterAtIndex:i];
 78         NSString *textC = [NSString stringWithFormat:@"%C", c];
 79
 80         [textC drawAtPoint:point withAttributes:@{NSFontAttributeName:kFontSize}];
 81     }
 82
 83     //调用drawRect:之前,系统会向栈中压入一个CGContextRef,调用UIGraphicsGetCurrentContext()会取栈顶的CGContextRef
 84     CGContextRef context = UIGraphicsGetCurrentContext();
 85     //设置画线宽度
 86     CGContextSetLineWidth(context, kLineWidth);
 87
 88     //绘制干扰的彩色直线
 89     for(int i = 0; i < kLineCount; i++)
 90     {
 91         //设置线的随机颜色
 92         UIColor *color = kRandomColor;
 93         CGContextSetStrokeColorWithColor(context, [color CGColor]);
 94         //设置线的起点
 95         pX = arc4random() % (int)rect.size.width;
 96         pY = arc4random() % (int)rect.size.height;
 97         CGContextMoveToPoint(context, pX, pY);
 98         //设置线终点
 99         pX = arc4random() % (int)rect.size.width;
100         pY = arc4random() % (int)rect.size.height;
101         CGContextAddLineToPoint(context, pX, pY);
102         //画线
103         CGContextStrokePath(context);
104     }
105 }
106
107 @end

如何使用:

1 //显示验证码界面
2 AuthCodeView *codeView = [[AuthCodeView alloc] initWithFrame:CGRectMake(20, 40, 150, 40)];
3 [self.view addSubview:codeView];
时间: 2024-10-10 10:27:05

【iOS】使用UIView绘制本地验证码的相关文章

iOS界面的绘制和渲染

界面的绘制和渲染 UIView是如何到显示的屏幕上的. 这件事要从RunLoop开始,RunLoop是一个60fps的回调,也就是说每16.7ms绘制一次屏幕,也就是我们需要在这个时间内完成view的缓冲区创建,view内容的绘制这些是CPU的工作:然后把缓冲区交给GPU渲染,这里包括了多个View的拼接(Compositing),纹理的渲染(Texture)等等,最后Display到屏幕上.但是如果你在16.7ms内做的事情太多,导致CPU,GPU无法在指定时间内完成指定的工作,那么就会出现卡

Android本地验证码的生成

android客户端生成本地验证码主要用来限制用户随意按请求按钮,其实该示例也是来对自定义view的练练手而已,先给出效果图吧 其中可定制: *干扰线数目 *干扰点数目 *背景颜色 *验证码字体大小及字数 相信以上可以满足一般的需要了吧,不够的话可自行添加,下面就来讲实现的步骤了 继承view,重写构造方法,并初始化所需参数 public class ValidationCode extends View { private Paint mTextPaint;//文字画笔 private Pai

多媒体编程——ios视频图像绘制工具类。

IOS上视频级的图像绘制 ios上的图像绘制常规的是 UIView的drawRect函数,但是这个函数是异步触发,并且由主线程执行.虽然可以通过一定技巧达到主动绘制的效果: 1.传递图像给UIView缓存着. 2.然后调用UIView的setNeedDisplay 改写重绘标志. (以上两步是讲图像丢给UIView,让它自己进行绘制,但是绘制的时机不可控,有时候我们需要它马上绘制,甚至有时候我们需要知道它什么时候绘制完成了,就需要下面两步) 3.在播放线程中调用UIView的 perfromOn

Android开发——本地验证码的简易实现(防止暴力登录)

0.  前言   验证码无处不在,有人问我,你知道达芬奇密码下面是什么吗,对,答案就是达芬奇验证码. 验证码一个最主要的作用就是防止恶意暴力破解登录,防止不间断的登录尝试,有人说其实可以在服务器端对该终端进行登录间隔检测,如果间隔太短可以展示拒绝的姿态.但是还是本地验证码作用更加实在,可以减轻服务器端的压力.这篇将使用自定义View来实现一个如下效果的简易本地验证码.算是对自定义View知识的复习吧. 1.  布局结构   <RelativeLayout xmlns:android="ht

iOS 使用drawRect: 绘制虚线椭圆

1:首先如果要使用 drawRect 绘图 要导入 CoreGraphics.framework 框架 然后 创建 自定义view, 即是 myView继承 UIView; 2: 重写 - (void)drawRect:(CGRect)rect 方法: 3:添加如下代码 - (void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); CGFloat lengths[] = {5,5,5,5

IOS将UIView转化为UIImage

+(UIImage*)createImageFromView:(UIView*)view { //obtain scale CGFloat scale = [UIScreen mainScreen].scale; 开始绘图,下面方法,第一个参数表示区域大小.第二个参数表示是否是非透明的.如果需要显示半透明效果,需要传NO,否则传YES.第三个参数就是屏幕密度了 UIGraphicsBeginImageContextWithOptions(CGSizeMake(view.frame.size.wi

生成本地验证码 _Android源码

这是我做的项目的一个小功能,实现了产生本地验证码的功能,点击验证码图片可以进行更换,其中还包含一些控件的美化,代码很简单,适合初学者. 下载地址:http://www.devstore.cn/code/info/721.html

ios 继承UIView实现自定义视图——实现画图

主要的原理包括: 继承UIView ,重载drawrect和重载触摸事件 待实现的功能还有,路径数组保存等. 用可变数据保存path路径 画曲线是通过二次贝塞尔曲线实现的 这里可以得到画图的UIImage对象 UIGraphicsBeginImageContext(self.bounds.size); [self.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *result=UIGraphicsGetImageFrom

ios 给uiview创作遮罩

mask一定是PNG格式的图像,去掉背景 .jpg格式图片没有alpha values 遮罩是通过图片透明度的信息实现与颜色无关 UIImage*_maskingImage =[UIImage imageNamed:@"mask"];CALayer*_maskingLayer =[CALayer layer];_maskingLayer.frame = theView.bounds;[_maskingLayer setContents:(id)[_maskingImage CGImag