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


SDauthCode簡(jiǎn)介


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



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


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

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

    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]) {
        
        //這里面寫(xiě)驗(yàn)證正確之后的動(dòng)作.

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

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


SDauthCode的專屬定制


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

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


SDauthCode的重新生成


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

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

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

    [codeView reloadAuthCodeView];


SDauthCode的核心代碼詳解


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

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

#pragma mark ---- 隨機(jī)生成驗(yàn)證碼 ----
-(void)produceAuthCodeString{

    NSMutableString *produceString = [[NSMutableString alloc]initWithCapacity:16];
    
    switch (self.allWordArraytype) {
        case BlendWordAndNumbers:{
        
            //混合庫(kù)模式
            
            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ù)定制屬性來(lái)先設(shè)置我們的文本屬性信息,然后進(jìn)行繪制操作.代碼如下所示.

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

    paragraphStyle.alignment = NSTextAlignmentCenter;//(兩端對(duì)齊的)文本對(duì)齊方式:(左,中,右,兩端對(duì)齊,自然)
    
    
    [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);

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



最后再說(shuō),SDauthCode是一個(gè)本地的動(dòng)態(tài)驗(yàn)證碼,它的主要作用是用于防止有人惡意訪問(wèn)接口.恩寫(xiě)到這,Core Graphics框架相關(guān)學(xué)習(xí)資料也將告一段落了,最后附上SDauthCode的下載傳送門(mén).
-->SDauthCode傳送門(mén)??
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末眉孩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌碟贾,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件轨域,死亡現(xiàn)場(chǎng)離奇詭異袱耽,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)干发,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)朱巨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人枉长,你說(shuō)我怎么就攤上這事冀续。” “怎么了必峰?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵洪唐,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我吼蚁,道長(zhǎng)凭需,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任肝匆,我火速辦了婚禮粒蜈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘旗国。我一直安慰自己枯怖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布能曾。 她就那樣靜靜地躺著嫁怀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪借浊。 梳的紋絲不亂的頭發(fā)上塘淑,一...
    開(kāi)封第一講書(shū)人閱讀 51,198評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音蚂斤,去河邊找鬼存捺。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的捌治。 我是一名探鬼主播岗钩,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼肖油!你這毒婦竟也來(lái)了兼吓?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤森枪,失蹤者是張志新(化名)和其女友劉穎视搏,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體县袱,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡浑娜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了式散。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片筋遭。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖暴拄,靈堂內(nèi)的尸體忽然破棺而出漓滔,到底是詐尸還是另有隱情,我是刑警寧澤乖篷,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布次和,位于F島的核電站,受9級(jí)特大地震影響那伐,放射性物質(zhì)發(fā)生泄漏踏施。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一罕邀、第九天 我趴在偏房一處隱蔽的房頂上張望畅形。 院中可真熱鬧,春花似錦诉探、人聲如沸日熬。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)竖席。三九已至,卻和暖如春敬肚,著一層夾襖步出監(jiān)牢的瞬間毕荐,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工艳馒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留憎亚,地道東北人员寇。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像第美,于是被迫代替她去往敵國(guó)和親蝶锋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

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