iOS 圖片驗(yàn)證碼

復(fù)制粘貼 歡樂(lè)就完了

1厌衔、 創(chuàng)建一個(gè)繼承與UIview的類名字叫XGAuthCode
44444.png

2仿滔、XGAuthCode.h文件中復(fù)制以下代碼

@property (strong, nonatomic) NSMutableString *authCodeStr;//驗(yàn)證碼字符串

@property (strong, nonatomic) NSArray *dataArray;

- (void) getAuthcode;
2222222.png

3、XGAuthCode.m文件中復(fù)制以下代碼

#define kRandomColorAL  [UIColor colorWithRed:arc4random() % 256 / 256.0 green:arc4random() % 256 / 256.0 blue:arc4random() % 256 / 256.0 alpha:0.5];
//干擾線隨機(jī)顏色
#define kRandomColor  [UIColor colorWithRed:arc4random() % 256 / 256.0 green:arc4random() % 256 / 256.0 blue:arc4random() % 256 / 256.0 alpha:1];
//干擾線數(shù)量
#define kLineCount 4
//干擾線寬度
#define kLineWidth 1.0
//驗(yàn)證碼數(shù)量
#define kCharCount 4
//驗(yàn)證碼大小
#define kFontSize (arc4random() % 5 + 20)

- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
        self.layer.cornerRadius = 5.0f;
        self.layer.masksToBounds = YES;
        self.backgroundColor = kRandomColor;
        
        [self getAuthcode];//獲得隨機(jī)驗(yàn)證碼
    }
    return self;
}

#pragma mark 獲得隨機(jī)驗(yàn)證碼
- (void)getAuthcode
{
    //字符串素材
    _dataArray = [[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",@"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];
    
    _authCodeStr = [[NSMutableString alloc] initWithCapacity:kCharCount];
    //隨機(jī)從數(shù)組中選取需要個(gè)數(shù)的字符串膝擂,拼接為驗(yàn)證碼字符串
    for (int i = 0; i < kCharCount; I++)
    {
        NSInteger index = arc4random() % (_dataArray.count-1);
        NSString *tempStr = [_dataArray objectAtIndex:index];
        _authCodeStr = (NSMutableString *)[_authCodeStr stringByAppendingString:tempStr];
    }
}

#pragma mark 點(diǎn)擊界面切換驗(yàn)證碼
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self getAuthcode];
    
    //setNeedsDisplay調(diào)用drawRect方法來(lái)實(shí)現(xiàn)view的繪制
    [self setNeedsDisplay];
}

#pragma mark 繪制
- (void)drawRect:(CGRect)rect
{
    [super drawRect:rect];
    
    //設(shè)置隨機(jī)背景顏色
    self.backgroundColor = kRandomColorAL;
    
    //根據(jù)要顯示的驗(yàn)證碼字符串亚斋,根據(jù)長(zhǎng)度,計(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;
    
    //依次繪制每一個(gè)字符,可以設(shè)置顯示的每個(gè)字符的字體大小拂募、顏色庭猩、樣式等
    float pX,pY;
    for ( int i = 0; i < text.length; I++)
    {
        pX = arc4random() % width + rect.size.width/text.length * I;
        pY = arc4random() % height;
        point = CGPointMake(pX, pY);
        
        unichar c = [text characterAtIndex:i];
        NSString *textC = [NSString stringWithFormat:@"%C", c];
        UIFontDescriptor *attributeFontDescriptor = [UIFontDescriptor fontDescriptorWithFontAttributes:
                                                     @{UIFontDescriptorFamilyAttribute: @"Marion",
                                                       UIFontDescriptorNameAttribute:@"HanziPenSC-W3",
                                                       UIFontDescriptorSizeAttribute: @40.0,
                                                       UIFontDescriptorMatrixAttribute:[NSValue valueWithCGAffineTransform:CGAffineTransformMakeRotation(M_1_PI*(arc4random() % 2 ))
                                                                                        ]}];
        UIFont * font = [UIFont fontWithDescriptor:attributeFontDescriptor size:kFontSize];
        UIColor *color = kRandomColor;
        [textC drawAtPoint:point withAttributes:@{NSFontAttributeName:font,NSForegroundColorAttributeName:color}];
        
    }
    
    
    //調(diào)用drawRect:之前,系統(tǒng)會(huì)向棧中壓入一個(gè)CGContextRef陈症,調(diào)用UIGraphicsGetCurrentContext()會(huì)取棧頂?shù)腃GContextRef
    CGContextRef context = UIGraphicsGetCurrentContext();
    //設(shè)置線條寬度
    CGContextSetLineWidth(context, kLineWidth);
    
    //繪制干擾線
    for (int i = 0; i < kLineCount; I++)
    {
        UIColor *color = kRandomColor;
        CGContextSetStrokeColorWithColor(context, color.CGColor);//設(shè)置線條填充色
        
        //設(shè)置線的起點(diǎn)
        pX = arc4random() % (int)rect.size.width;
        pY = arc4random() % (int)rect.size.height;
        CGContextMoveToPoint(context, pX, pY);
        //設(shè)置線終點(diǎn)
        pX = arc4random() % (int)rect.size.width;
        pY = arc4random() % (int)rect.size.height;
        CGContextAddLineToPoint(context, pX, pY);
        //畫線
        CGContextStrokePath(context);
    }
}
3333333.png

4蔼水、使用方法在需要使用的文件中導(dǎo)入 #import "XGAuthCode.h"

1、定義屬性:

@property (nonatomic, strong) XGAuthCode * authcodeImage; //< 驗(yàn)證碼視圖

2录肯、初始化:

self.authcodeImage = [[XGAuthCode alloc] initWithFrame:CGRectMake(XGWidth*0.5-60, 5*XGREM, 120, 60)];
[self.view addSubview:self.authcodeImage];
[self.authcodeImage getAuthcode];
NSLog(@"%@",self.authcodeImage.authCodeStr);

3趴腋、獲取驗(yàn)證碼:

NSLog(@"%@",self.authcodeImage.authCodeStr);

請(qǐng)根據(jù)項(xiàng)目中根據(jù)實(shí)際業(yè)務(wù)判斷邏輯將圖形驗(yàn)證添加到適當(dāng)?shù)奈恢眠M(jìn)行圖形驗(yàn)證

附:效果圖如下
111111.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市论咏,隨后出現(xiàn)的幾起案子优炬,更是在濱河造成了極大的恐慌,老刑警劉巖厅贪,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蠢护,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡养涮,警方通過(guò)查閱死者的電腦和手機(jī)葵硕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)单寂,“玉大人贬芥,你說(shuō)我怎么就攤上這事⌒觯” “怎么了蘸劈?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)尊沸。 經(jīng)常有香客問(wèn)我威沫,道長(zhǎng),這世上最難降的妖魔是什么洼专? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任棒掠,我火速辦了婚禮,結(jié)果婚禮上屁商,老公的妹妹穿的比我還像新娘烟很。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布雾袱。 她就那樣靜靜地躺著恤筛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪芹橡。 梳的紋絲不亂的頭發(fā)上毒坛,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音林说,去河邊找鬼煎殷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛腿箩,可吹牛的內(nèi)容都是我干的豪直。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼度秘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼顶伞!你這毒婦竟也來(lái)了饵撑?” 一聲冷哼從身側(cè)響起剑梳,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎滑潘,沒(méi)想到半個(gè)月后垢乙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡语卤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年追逮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粹舵。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡钮孵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出眼滤,到底是詐尸還是另有隱情巴席,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布诅需,位于F島的核電站漾唉,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏堰塌。R本人自食惡果不足惜赵刑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望场刑。 院中可真熱鬧般此,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至居扒,卻和暖如春概漱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背喜喂。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工瓤摧, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人玉吁。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓照弥,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親进副。 傳聞我的和親對(duì)象是個(gè)殘疾皇子这揣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,089評(píng)論 1 32
  • 登錄注冊(cè)時(shí)用的驗(yàn)證碼效果圖 ViewDidload調(diào)用即可 } @endgithub下載地址
    七分唄輕唱閱讀 4,875評(píng)論 1 30
  • 這個(gè)標(biāo)題有點(diǎn)標(biāo)題黨了给赞,我不是開超市的,也不知道如何經(jīng)營(yíng)一家超市矫户。但是片迅,作為消費(fèi)者,我在逛任何一個(gè)店皆辽,買任何一樣?xùn)|西...
    木子桃心說(shuō)閱讀 1,020評(píng)論 0 5
  • 卡爾·霍夫蘭及其助手通過(guò)實(shí)驗(yàn)發(fā)現(xiàn),在“一面說(shuō)”和“兩面說(shuō)”兩種版本的勸服訊息中,“一面說(shuō)”對(duì)于原先就贊同的人非常奏...
    沈惜朝閱讀 450評(píng)論 0 0
  • Mysql 批量刪除表名 MYSQL批量修改表前綴與表名sql語(yǔ)句
    Leo_23閱讀 159評(píng)論 0 0