iOS第三方库iOS控件封装绘制

SDauthCode:一个基于Core Graphics框架的本

2016-09-08  本文已影响327人  神经骚栋

</br>

SDauthCode简介


SDauthCode是一款基于Core Graphics框架的本地动态验证码,SDauthCode使用起来简单易懂,如果我们不需要特别的定制,我们只需要一行代码就可以快速生成一个本地验证码View,同时,允许用户对SDauthCode的样式进行调整.比如取材库,验证码的位数,干扰线的条数,刷新验证码等等,通过不同的定制可以应对不同的实际情况.那么我们接下来看一下SDauthCode的实际效果.


</br>

一行代码快速生成验证码


首先,我们把SDauthCode.hSDauthCode.m两个文件导入所需要的工程当中去.

使用SDauthCode快速生成验证码,我们只需要一个初始化方法即可.无需繁琐步骤,即可快速生成.代码如下.

    SDauthCode *codeView = [[SDauthCode alloc]initWithFrame:CGRectMake(100, 100, 200, 40)];

只要把上面的codeView添加到所需要放置的位置上即可.

    [self.view addSubview:codeView];

那么如何验证用户是否输入正确呢?SDauthCode有个属性叫做authCodeString,我们只需要把输入的字符串和authCodeString比较即可.

    if ([codeView.authCodeString isEqualToString:self.textField.text]) {
        
        //这里面写验证正确之后的动作.

        tipWithMessage(@"输入验证码正确");
    }else{
        
        //这里面写验证失败之后的动作.

        tipWithMessage(@"输入验证码错误");
    }

</br>

SDauthCode的专属定制


当快速生成不能满足我们的需求的时候,这时候,你可以根据SDauthCode所暴露出来的属性,来定制属于自己的本地动态验证码.下面我们就看一下SDauthCode的所有的定制属性.

属性 类型 说明
allWordArraytype AllWordArraytypes allWordArraytype是一个枚举类型,用来指定取材库的类型,默认的是文字和数字混合模式.
authCodeNumber NSInteger authCodeNumber是用来定制验证码的字符个数的,默认的是4位
disturbLineNumber NSInteger disturbLineNumber是用来指定图片中干扰线的数量的,默认的是2条干扰线
fontSize NSInteger fontSize是用来指定验证码字体大小的,默认的为17号字
WordSpacingTypes WordSpacingTypes WordSpacingTypes是一个枚举类型,用来指定字符间距的大小,有4种可以选择,分别是没有间隔,间隔较小,间隔中等,间隔较大,对应的数字为0,10,20,40
authCodeRect CGRect authCodeRect是用来指定验证码字符串的大小和位置.

</br>

SDauthCode的重新生成


验证码的重新生成总共有两种方式,一种是用户直接点击验证码,另外一种则是调用SDauthCode自带的-(void)reloadAuthCodeView;方法进行重新生成.

直接点击SDauthCode对象,在SDauthCode对象的touchBegan方法中会重新生成验证码以及重新绘制SDauthCode对象.

调用-(void)reloadAuthCodeView;方法原理和touchBegan是一样的,会重新生成验证码以及重新绘制SDauthCode对象.调用如下所示.一句代码即可.

    [codeView reloadAuthCodeView];

</br>

SDauthCode的核心代码详解


本文的题目就说是SDauthCode是一个基于Core Graphics框架的本地动态验证码.所以核心代码是存在于SDauthCode中的- (void)drawRect:(CGRect)rect方法中的.

在此之前,我们会到指定取材库中取出指定的个数的字符,组成字符串.同时要赋值给authCodeString属性.

#pragma mark ---- 随机生成验证码 ----
-(void)produceAuthCodeString{

    NSMutableString *produceString = [[NSMutableString alloc]initWithCapacity:16];
    
    switch (self.allWordArraytype) {
        case BlendWordAndNumbers:{
        
            //混合库模式
            
            NSMutableArray *blendArray = [NSMutableArray arrayWithArray:self.numbersArray];
            
            [blendArray addObjectsFromArray:self.wordsArray];
            
            for (int i = 0; i<self.authCodeNumber; i++) {
                
                //随机下标
                int indexNumber = arc4random()%(blendArray.count);
                
                [produceString appendString:blendArray[indexNumber]];
                
            }
        
        }
            
            break;
            
        case OnlyNumbers:{
            
            //数字模式
            
            NSMutableArray *blendArray = [NSMutableArray arrayWithArray:self.numbersArray];
            
            
            for (int i = 0; i<self.authCodeNumber; i++) {
                
                //随机下标
                int indexNumber = arc4random()%(blendArray.count);
                
                [produceString appendString:blendArray[indexNumber]];
                
            }
      
        }
            
            break;
              
        case OnlyWord:{
            
            //字母模式
            NSMutableArray *blendArray = [NSMutableArray arrayWithArray:self.wordsArray];
            
            for (int i = 0; i<self.authCodeNumber; i++) {
                
                //随机下标
                int indexNumber = arc4random()%(blendArray.count);
                
                [produceString appendString:blendArray[indexNumber]];
                
            }
            

        }
            
            break;
   
    }
    

    self.authCodeString = produceString;


}

然后,我们可以在- (void)drawRect:(CGRect)rect方法中,先设置SDauthCode的背景颜色为随机色.

    //背景设置
    self.backgroundColor = KrandomColor;

然后就是绘制我们的文本,在绘制之前,我们会根据定制属性来先设置我们的文本属性信息,然后进行绘制操作.代码如下所示.

    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];

    paragraphStyle.alignment = NSTextAlignmentCenter;//(两端对齐的)文本对齐方式:(左,中,右,两端对齐,自然)
    
    
    [self.authCodeString drawInRect:_authCodeRect withAttributes:@{
                                                               
                                                                NSForegroundColorAttributeName :KrandomColor,
                                                                NSKernAttributeName: [self wordSpacingNumberWithType],
                                                                NSParagraphStyleAttributeName:paragraphStyle,
                                                                NSFontAttributeName : [UIFont systemFontOfSize:_fontSize],
                                                               
                                                                }];

接着,就要绘制干扰线了,我们让干扰线的初始位置和终止位置为随机的.

        //设置随机位置的x和y
        CGSize viewSize = self.frame.size;
        
        int startX = arc4random()%((int)viewSize.width/2);
        
        int endX = arc4random()%((int)viewSize.width - (int)viewSize.width/2) +(int)viewSize.width/2;
        
        int startY = arc4random()%((int)viewSize.height);
        
        int endY = arc4random()%((int)viewSize.height);

设置完成干扰线的初始位置和终止位置,我们直接绘制我们的干扰线即可,代码如下所示.当然,绘制完成之后,要释放掉绘制的路径.

        //获取上下文
        CGContextRef contextRef = UIGraphicsGetCurrentContext();
        
        //创建路径
        CGMutablePathRef path = CGPathCreateMutable();
        
        CGPathMoveToPoint(path, nil, startX, startY);
        
        CGPathAddLineToPoint(path, nil, endX, endY);
        
        CGContextAddPath(contextRef, path);
        
        //设置图形上下文状态属性
        CGContextSetRGBStrokeColor(contextRef, arc4random_uniform(256) / 255.0, arc4random_uniform(256) / 255.0, arc4random_uniform(256) / 255.0, 1);//设置笔触颜色
        CGContextSetLineWidth(contextRef, 1);//设置线条宽度
        
        CGContextDrawPath(contextRef, kCGPathFillStroke);//最后一个参数是填充类型
        
        CGPathRelease(path);

绘制干扰线完成之后,我们的绘制核心工作也就完成了.

</br>


最后再说,SDauthCode是一个本地的动态验证码,它的主要作用是用于防止有人恶意访问接口.恩写到这,Core Graphics框架相关学习资料也将告一段落了,最后附上SDauthCode的下载传送门.
-->SDauthCode传送门💾
上一篇下一篇

猜你喜欢

热点阅读