彩色干擾線驗(yàn)證碼

利用Quartz2D實(shí)現(xiàn):
繪圖步驟: 1.獲取上下文 2.描述路徑 3.把路徑添加到上下文 4.渲染上下文
drawRect:畫(huà)線必須要在drawRect方法實(shí)現(xiàn)担汤,因?yàn)橹挥性赿rawRect方法中才能獲取到根view相關(guān)聯(lián)上下文歉糜;當(dāng)前控件即將顯示的時(shí)候調(diào)用壳贪,只調(diào)用一次咒精;
注意: drawRect不能手動(dòng)調(diào)用锌钮;drawRect只能系統(tǒng)調(diào)用,每次系統(tǒng)調(diào)用drawRect方法之前,都會(huì)給drawRect方法傳遞一個(gè)跟當(dāng)前view相關(guān)聯(lián)上下文陨闹;
執(zhí)行[self.view setNeedsDisplay];會(huì)調(diào)用drawRect樟凄。

效果圖
#define kRandomColor [UIColor colorWithRed:arc4random()%255/255.0 green:arc4random()%255/255.0 blue:arc4random()%255/255.0 alpha:1.0] //隨機(jī)顏色
#define kLineCount 6        //干擾線的個(gè)數(shù)
#define kLineWidth 1.0      //干擾線的寬度
#define kCharCount 5        //需要驗(yàn)證碼的個(gè)數(shù)
#define kFontSize [UIFont systemFontOfSize:arc4random() % 5 + 15]   //字體大小

獲取隨機(jī)驗(yàn)證碼

#pragma mark - 獲取隨機(jī)驗(yàn)證碼
- (void)getAuthcode {

    _authCodeStr = [[NSMutableString alloc] initWithCapacity:kCharCount];
    _dataArray = @[@1,@2,@4,@5,@7,@8,@0,@9,@"Z",@"W",@"E",@"R",@"L",@"w",@"g",@"j",@"t",@"v"];

    //隨機(jī)從素材數(shù)組中取出需要個(gè)數(shù)的字符串聘芜,拼接為驗(yàn)證碼字符串存入驗(yàn)證碼數(shù)組中
    for (int i = 0; i < kCharCount; i ++){
        NSInteger index = arc4random() % self.dataArray.count;
        [self.authCodeStr insertString:[NSString stringWithFormat:@"%@",self.dataArray[index]] atIndex:i];
    }
    
}

點(diǎn)擊view刷新驗(yàn)證碼

//點(diǎn)擊界面切換驗(yàn)證碼
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

    [self getAuthcode];
    [self setNeedsDisplay];
}

繪制驗(yàn)證碼和線條

- (void)drawRect:(CGRect)rect {
    [super drawRect:rect];
    self.backgroundColor = [UIColor whiteColor];
    
    /*計(jì)算每個(gè)字符串顯示的位置*/
    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 tempX,tempY;
    for (int i = 0 ; i < text.length; i ++) {
        tempX = arc4random() % width + rect.size.width / text.length * i;
        tempY = arc4random() % height;
        point = CGPointMake(tempX, tempY);
        
        unichar c = [text characterAtIndex:i];
        NSString *textC = [NSString stringWithFormat:@"%C", c];
        
        [textC drawAtPoint:point withAttributes:@{NSFontAttributeName:kFontSize}];
    }
   
    //繪制kLineCount條隨機(jī)色干擾線
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetLineWidth(context,kLineWidth);
    for(int cout = 0; cout < kLineCount; cout++)
    {
        
        CGContextSetStrokeColorWithColor(context, kRandomColor.CGColor);
        tempX = arc4random() % (int)rect.size.width;
        tempY = arc4random() % (int)rect.size.height;
        CGContextMoveToPoint(context, tempX, tempY);
        tempX = arc4random() % (int)rect.size.width;
        tempY = arc4random() % (int)rect.size.height;
        CGContextAddLineToPoint(context, tempX, tempY);
        CGContextStrokePath(context);
    }
   
    
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末间聊,一起剝皮案震驚了整個(gè)濱河市辜贵,隨后出現(xiàn)的幾起案子描函,更是在濱河造成了極大的恐慌,老刑警劉巖衣形,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件渠啊,死亡現(xiàn)場(chǎng)離奇詭異值漫,居然都是意外死亡乡数,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)嗅战,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)庐扫,“玉大人,你說(shuō)我怎么就攤上這事仗哨⌒瓮ィ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵厌漂,是天一觀的道長(zhǎng)萨醒。 經(jīng)常有香客問(wèn)我,道長(zhǎng)苇倡,這世上最難降的妖魔是什么富纸? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮旨椒,結(jié)果婚禮上晓褪,老公的妹妹穿的比我還像新娘。我一直安慰自己综慎,他們只是感情好涣仿,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著示惊,像睡著了一般好港。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上米罚,一...
    開(kāi)封第一講書(shū)人閱讀 52,475評(píng)論 1 312
  • 那天钧汹,我揣著相機(jī)與錄音,去河邊找鬼录择。 笑死拔莱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的隘竭。 我是一名探鬼主播塘秦,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼货裹!你這毒婦竟也來(lái)了嗤形?” 一聲冷哼從身側(cè)響起精偿,我...
    開(kāi)封第一講書(shū)人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤弧圆,失蹤者是張志新(化名)和其女友劉穎赋兵,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體搔预,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡霹期,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拯田。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片历造。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖船庇,靈堂內(nèi)的尸體忽然破棺而出吭产,到底是詐尸還是另有隱情,我是刑警寧澤鸭轮,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布臣淤,位于F島的核電站,受9級(jí)特大地震影響窃爷,放射性物質(zhì)發(fā)生泄漏邑蒋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一按厘、第九天 我趴在偏房一處隱蔽的房頂上張望医吊。 院中可真熱鬧,春花似錦逮京、人聲如沸卿堂。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)御吞。三九已至,卻和暖如春漓藕,著一層夾襖步出監(jiān)牢的瞬間陶珠,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工享钞, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留揍诽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓栗竖,卻偏偏與公主長(zhǎng)得像暑脆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子狐肢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

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

  • Quartz2D以及drawRect的重繪機(jī)制字?jǐn)?shù)1487 閱讀21 評(píng)論1 喜歡1一添吗、什么是Quartz2D Q...
    PurpleWind閱讀 775評(píng)論 0 3
  • Quartz2D 簡(jiǎn)介 Quartz2D是二維(平面)的繪圖引擎(經(jīng)包裝的函數(shù)庫(kù),方便開(kāi)發(fā)者使用份名。也就是說(shuō)蘋(píng)果幫我...
    iOS_Cqlee閱讀 633評(píng)論 0 2
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理碟联,服務(wù)發(fā)現(xiàn)妓美,斷路器,智...
    卡卡羅2017閱讀 134,711評(píng)論 18 139
  • 什么是Quartz2D 是一個(gè)二維的繪圖引擎,同時(shí)支持iOS和Mac系統(tǒng) Quartz2D的API是純C語(yǔ)言的,它...
    Mario_ZJ閱讀 590評(píng)論 0 1
  • 利小夕閱讀 405評(píng)論 0 0