IOS防止機器人登錄的驗證碼控件

.h文件



#import <UIKit/UIKit.h>

@class LXFVerificationCodeView;

@protocol LXFVerificationCodeViewDelegate <NSObject>

- (void) verificationCodeViewDidChange:(LXFVerificationCodeView *) verificationCodeView;

@end
@interface LXFVerificationCodeView : UIView

@property (nonatomic, weak) id<LXFVerificationCodeViewDelegate> delegate;

//驗證碼范圍的數(shù)組
@property (nonatomic, retain) NSArray *changeArray;
//獲取后的驗證碼
@property (nonatomic, retain) NSMutableString *changeString;
@end




.m文件


#import "LXFVerificationCodeView.h"

@implementation LXFVerificationCodeView

#pragma mark - 初始化
- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        
        self.layer.cornerRadius = 5.0;
        self.layer.masksToBounds = YES;
        self.backgroundColor = [UIColor blueColor];
        
        [self change];
    }
    return self;
}

#pragma mark - 點擊改變驗證碼
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self change];
    
    if ([_delegate respondsToSelector:@selector(verificationCodeViewDidChange:)]) {
        [_delegate verificationCodeViewDidChange:self];
    }
    
    //刷新背景
    [self setNeedsDisplay];
}

#pragma mark - 隨機獲取驗證碼
- (void)change
{
    //范圍
    self.changeArray = [[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];
    
    NSMutableString *getStr = [[NSMutableString alloc] initWithCapacity:5];
    
    //隨機字
    self.changeString = [[NSMutableString alloc] initWithCapacity:6];
    for(NSInteger i = 0; i < 4; i++)
    {
        NSInteger index = arc4random() % ([self.changeArray count] - 1);
        getStr = [self.changeArray objectAtIndex:index];
        
        self.changeString = (NSMutableString *)[self.changeString stringByAppendingString:getStr];
    }
}

#pragma mark - 隨機背景,隨機顏色
- (void)drawRect:(CGRect)rect {
    [super drawRect:rect];
    //背景顏色
    float red = arc4random() % 100 / 100.0;
    float green = arc4random() % 100 / 100.0;
    float blue = arc4random() % 100 / 100.0;
    UIColor *color = [UIColor colorWithRed:red green:green blue:blue alpha:1.0];
    [self setBackgroundColor:color];
    
    NSString *text = [NSString stringWithFormat:@"%@",self.changeString];
    
    NSMutableDictionary *attrDict = [NSMutableDictionary dictionary];
    attrDict[NSFontAttributeName] = [UIFont systemFontOfSize:14];
    CGSize cSize = [@"S" sizeWithAttributes:attrDict];
   
    int width = rect.size.width / text.length - cSize.width;
    int height = rect.size.height - cSize.height;
    CGPoint point;
    
    //字體的尺寸
    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];
        NSMutableDictionary *attriDict = [NSMutableDictionary dictionary];
        attrDict[NSFontAttributeName] = [UIFont systemFontOfSize:20];
        [textC drawAtPoint:point withAttributes:attriDict];
    }
    
    //劃線
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetLineWidth(context, 1.0);
    for(int cout = 0; cout < 10; cout++)
    {
        red = arc4random() % 100 / 100.0;
        green = arc4random() % 100 / 100.0;
        blue = arc4random() % 100 / 100.0;
        color = [UIColor colorWithRed:red green:green blue:blue alpha:1.0];
        CGContextSetStrokeColorWithColor(context, [color CGColor]);
        pX = arc4random() % (int)rect.size.width;
        pY = arc4random() % (int)rect.size.height;
        CGContextMoveToPoint(context, pX, pY);
        pX = arc4random() % (int)rect.size.width;
        pY = arc4random() % (int)rect.size.height;
        CGContextAddLineToPoint(context, pX, pY);
        CGContextStrokePath(context);
    }
}

- (void)setChangeString:(NSMutableString *)changeString{
    _changeString = changeString;
    [self setNeedsDisplay];
}
@end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市杭棵,隨后出現(xiàn)的幾起案子柠衅,更是在濱河造成了極大的恐慌,老刑警劉巖鹰贵,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晴氨,死亡現(xiàn)場離奇詭異,居然都是意外死亡碉输,警方通過查閱死者的電腦和手機籽前,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來敷钾,“玉大人枝哄,你說我怎么就攤上這事∽杌模” “怎么了挠锥?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長侨赡。 經(jīng)常有香客問我蓖租,道長粱侣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任蓖宦,我火速辦了婚禮齐婴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘稠茂。我一直安慰自己柠偶,他們只是感情好,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布睬关。 她就那樣靜靜地躺著诱担,像睡著了一般。 火紅的嫁衣襯著肌膚如雪电爹。 梳的紋絲不亂的頭發(fā)上蔫仙,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機與錄音丐箩,去河邊找鬼匀哄。 笑死,一個胖子當著我的面吹牛雏蛮,可吹牛的內(nèi)容都是我干的涎嚼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼挑秉,長吁一口氣:“原來是場噩夢啊……” “哼法梯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起犀概,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤立哑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后姻灶,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铛绰,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年产喉,在試婚紗的時候發(fā)現(xiàn)自己被綠了捂掰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡曾沈,死狀恐怖这嚣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情塞俱,我是刑警寧澤姐帚,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站障涯,受9級特大地震影響罐旗,放射性物質(zhì)發(fā)生泄漏膳汪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一九秀、第九天 我趴在偏房一處隱蔽的房頂上張望旅敷。 院中可真熱鬧,春花似錦颤霎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至柔纵,卻和暖如春缔杉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背搁料。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工或详, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人郭计。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓霸琴,卻偏偏與公主長得像,于是被迫代替她去往敵國和親昭伸。 傳聞我的和親對象是個殘疾皇子梧乘,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

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

  • ## 可重入函數(shù) ### 可重入性的理解 若一個程序或子程序可以安全的被并行執(zhí)行,則稱其為可重入的庐杨;即當該子程序正...
    夏至亦韻閱讀 714評論 0 0
  • 我們做登錄的時候經(jīng)常會使用到选调,驗證手機號是否正確、向手機發(fā)送驗證碼倒計時60s的問題灵份,我們改如何解決呢仁堪?讓我們一起...
    誰遇而安閱讀 1,408評論 0 8
  • Ubuntu的發(fā)音 Ubuntu氛什,源于非洲祖魯人和科薩人的語言横浑,發(fā)作 oo-boon-too 的音。了解發(fā)音是有意...
    螢火蟲de夢閱讀 99,360評論 9 467
  • 1.定義和調(diào)用一個無參無返回值的函數(shù) 2.定義和調(diào)用一個無參有返回值的函數(shù)(返回值類型為int) 3.同一個函數(shù)可...
    kSimpleCoder閱讀 175評論 0 1
  • 我是個其貌不揚屉更,身材一般徙融,甚至有些個骨子里透著一小股自卑的姑娘。即便如此瑰谜,卻從未放棄過追逐繁星的腳步欺冀,我沒有驚天動...
    風(fēng)起來的時光jydyh閱讀 200評論 0 0