SDauthCode:一個(gè)基于Core Graphics框架的本地動(dòng)態(tài)驗(yàn)證碼


SDauthCode簡介


SDauthCode是一款基于Core Graphics框架的本地動(dòng)態(tài)驗(yàn)證碼,SDauthCode使用起來簡單易懂,如果我們不需要特別的定制,我們只需要一行代碼就可以快速生成一個(gè)本地驗(yàn)證碼View,同時(shí),允許用戶對SDauthCode的樣式進(jìn)行調(diào)整.比如取材庫,驗(yàn)證碼的位數(shù),干擾線的條數(shù),刷新驗(yàn)證碼等等,通過不同的定制可以應(yīng)對不同的實(shí)際情況.那么我們接下來看一下SDauthCode的實(shí)際效果.



一行代碼快速生成驗(yàn)證碼


首先,我們把SDauthCode.hSDauthCode.m兩個(gè)文件導(dǎo)入所需要的工程當(dāng)中去.

使用SDauthCode快速生成驗(yàn)證碼,我們只需要一個(gè)初始化方法即可.無需繁瑣步驟,即可快速生成.代碼如下.

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

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

    [self.view addSubview:codeView];

那么如何驗(yàn)證用戶是否輸入正確呢?SDauthCode有個(gè)屬性叫做authCodeString,我們只需要把輸入的字符串和authCodeString比較即可.

    if ([codeView.authCodeString isEqualToString:self.textField.text]) {
        
        //這里面寫驗(yàn)證正確之后的動(dòng)作.

        tipWithMessage(@"輸入驗(yàn)證碼正確");
    }else{
        
        //這里面寫驗(yàn)證失敗之后的動(dòng)作.

        tipWithMessage(@"輸入驗(yàn)證碼錯(cuò)誤");
    }


SDauthCode的專屬定制


當(dāng)快速生成不能滿足我們的需求的時(shí)候,這時(shí)候,你可以根據(jù)SDauthCode所暴露出來的屬性,來定制屬于自己的本地動(dòng)態(tài)驗(yàn)證碼.下面我們就看一下SDauthCode的所有的定制屬性.

屬性 類型 說明
allWordArraytype AllWordArraytypes allWordArraytype是一個(gè)枚舉類型,用來指定取材庫的類型,默認(rèn)的是文字和數(shù)字混合模式.
authCodeNumber NSInteger authCodeNumber是用來定制驗(yàn)證碼的字符個(gè)數(shù)的,默認(rèn)的是4位
disturbLineNumber NSInteger disturbLineNumber是用來指定圖片中干擾線的數(shù)量的,默認(rèn)的是2條干擾線
fontSize NSInteger fontSize是用來指定驗(yàn)證碼字體大小的,默認(rèn)的為17號字
WordSpacingTypes WordSpacingTypes WordSpacingTypes是一個(gè)枚舉類型,用來指定字符間距的大小,有4種可以選擇,分別是沒有間隔,間隔較小,間隔中等,間隔較大,對應(yīng)的數(shù)字為0,10,20,40
authCodeRect CGRect authCodeRect是用來指定驗(yàn)證碼字符串的大小和位置.


SDauthCode的重新生成


驗(yàn)證碼的重新生成總共有兩種方式,一種是用戶直接點(diǎn)擊驗(yàn)證碼,另外一種則是調(diào)用SDauthCode自帶的-(void)reloadAuthCodeView;方法進(jìn)行重新生成.

直接點(diǎn)擊SDauthCode對象,在SDauthCode對象的touchBegan方法中會(huì)重新生成驗(yàn)證碼以及重新繪制SDauthCode對象.

調(diào)用-(void)reloadAuthCodeView;方法原理和touchBegan是一樣的,會(huì)重新生成驗(yàn)證碼以及重新繪制SDauthCode對象.調(diào)用如下所示.一句代碼即可.

    [codeView reloadAuthCodeView];


SDauthCode的核心代碼詳解


本文的題目就說是SDauthCode是一個(gè)基于Core Graphics框架的本地動(dòng)態(tài)驗(yàn)證碼.所以核心代碼是存在于SDauthCode中的- (void)drawRect:(CGRect)rect方法中的.

在此之前,我們會(huì)到指定取材庫中取出指定的個(gè)數(shù)的字符,組成字符串.同時(shí)要賦值給authCodeString屬性.

#pragma mark ---- 隨機(jī)生成驗(yàn)證碼 ----
-(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++) {
                
                //隨機(jī)下標(biāo)
                int indexNumber = arc4random()%(blendArray.count);
                
                [produceString appendString:blendArray[indexNumber]];
                
            }
        
        }
            
            break;
            
        case OnlyNumbers:{
            
            //數(shù)字模式
            
            NSMutableArray *blendArray = [NSMutableArray arrayWithArray:self.numbersArray];
            
            
            for (int i = 0; i<self.authCodeNumber; i++) {
                
                //隨機(jī)下標(biāo)
                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++) {
                
                //隨機(jī)下標(biāo)
                int indexNumber = arc4random()%(blendArray.count);
                
                [produceString appendString:blendArray[indexNumber]];
                
            }
            

        }
            
            break;
   
    }
    

    self.authCodeString = produceString;


}

然后,我們可以在- (void)drawRect:(CGRect)rect方法中,先設(shè)置SDauthCode的背景顏色為隨機(jī)色.

    //背景設(shè)置
    self.backgroundColor = KrandomColor;

然后就是繪制我們的文本,在繪制之前,我們會(huì)根據(jù)定制屬性來先設(shè)置我們的文本屬性信息,然后進(jìn)行繪制操作.代碼如下所示.

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

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

接著,就要繪制干擾線了,我們讓干擾線的初始位置和終止位置為隨機(jī)的.

        //設(shè)置隨機(jī)位置的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);

設(shè)置完成干擾線的初始位置和終止位置,我們直接繪制我們的干擾線即可,代碼如下所示.當(dāng)然,繪制完成之后,要釋放掉繪制的路徑.

        //獲取上下文
        CGContextRef contextRef = UIGraphicsGetCurrentContext();
        
        //創(chuàng)建路徑
        CGMutablePathRef path = CGPathCreateMutable();
        
        CGPathMoveToPoint(path, nil, startX, startY);
        
        CGPathAddLineToPoint(path, nil, endX, endY);
        
        CGContextAddPath(contextRef, path);
        
        //設(shè)置圖形上下文狀態(tài)屬性
        CGContextSetRGBStrokeColor(contextRef, arc4random_uniform(256) / 255.0, arc4random_uniform(256) / 255.0, arc4random_uniform(256) / 255.0, 1);//設(shè)置筆觸顏色
        CGContextSetLineWidth(contextRef, 1);//設(shè)置線條寬度
        
        CGContextDrawPath(contextRef, kCGPathFillStroke);//最后一個(gè)參數(shù)是填充類型
        
        CGPathRelease(path);

繪制干擾線完成之后,我們的繪制核心工作也就完成了.



最后再說,SDauthCode是一個(gè)本地的動(dòng)態(tài)驗(yàn)證碼,它的主要作用是用于防止有人惡意訪問接口.恩寫到這,Core Graphics框架相關(guān)學(xué)習(xí)資料也將告一段落了,最后附上SDauthCode的下載傳送門.
-->SDauthCode傳送門??
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,608評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,139評論 25 708
  • 該屬性用來確定navigation bar背景是否為半透明.如果設(shè)置該屬性為NO,那么就不會(huì)有上面半透明的效果.
    指尖的跳動(dòng)閱讀 423評論 0 0
  • 2017年10月30日 星期一 晴 有些人,只能陪你到這 昨晚關(guān)燈入睡前,腦子里一直閃過這句話:有些人,只能陪你到...
    小小穎子閱讀 261評論 0 0
  • 越來越多的人開始接受這樣的觀點(diǎn) - 學(xué)習(xí)不會(huì)在離開校園后停止,而是將伴隨我們終生。 一、為什么要終生學(xué)習(xí) 1、學(xué)習(xí)...
    人在旅途_Amber閱讀 13,658評論 6 19

友情鏈接更多精彩內(nèi)容