iOS几种常用的自定义TextField

BaseTextField:空格开始输入

实现代码:

- (void)prepareTextFieldWithDefaultSetting

{

UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 0)];

self.leftView = leftView;

self.leftViewMode = UITextFieldViewModeAlways;

}

编辑前



编辑时




MoneyTextField:限制输入的文本符合规则

实现代码:

//MARK: - UITextFieldDelegate

//MARK: --开始编辑时

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

NSString *myDotNumbers = @"0123456789.\n";

NSString *myNumbers = @"0123456789\n";

// 判断是否输入内容,或者用户点击的是键盘的删除按钮

if (![string isEqualToString:@""]) {

NSCharacterSet *characterSet;

// 小数点在字符串中的位置 第一个数字从0位置开始

NSInteger dotLocation = [textField.text rangeOfString:@"."].location;

// 判断字符串中是否有小数点,并且小数点不在第一位

// NSNotFound 表示请求操作的某个内容或者item没有发现,或者不存在

// range.location 表示的是当前输入的内容在整个字符串中的位置,位置编号从0开始

if (dotLocation == NSNotFound && range.location != 0) {

// 取只包含“myDotNumbers”中包含的内容,其余内容都被去掉

/*

[NSCharacterSet characterSetWithCharactersInString:myDotNumbers]的作用是去掉"myDotNumbers"中包含的所有内容,只要字符串中有内容与"myDotNumbers"中的部分内容相同都会被舍去在上述方法的末尾加上invertedSet就会使作用颠倒,只取与“myDotNumbers”中内容相同的字符

*/

characterSet = [[NSCharacterSet characterSetWithCharactersInString:myDotNumbers] invertedSet];

if (range.location >= 9) {

NSLog(@"单笔金额不能超过亿位");

if ([string isEqualToString:@"."] && range.location == 9) {

return YES;

}

return NO;

}

}else {

characterSet = [[NSCharacterSet characterSetWithCharactersInString:myNumbers] invertedSet];

}

// 按characterSet分离出数组,数组按@""分离出字符串

NSString *filtered = [[string componentsSeparatedByCharactersInSet:characterSet] componentsJoinedByString:@""];

BOOL basicTest = [string isEqualToString:filtered];

if (!basicTest) {

NSLog(@"只能输入数字和小数点");

return NO;

}

if (dotLocation != NSNotFound && range.location > dotLocation + 2) {

NSLog(@"小数点后最多两位");

return NO;

}

if (textField.text.length > 11) {

return NO;

}

}

return YES;

}



PhoneTextField:自动匹配3-4-4手机格式,并提供检测输入的手机号码是否合法的接口

实现代码:

//MARK: -

//MARK: --输入框的文本改变时

- (void)actionEditingChanged:(PhoneTextField *)textField

{

//当前光标位置

NSInteger currentPosition = [textField offsetFromPosition:textField.beginningOfDocument toPosition:textField.selectedTextRange.start];

NSString *onlyNumberString = [self getOnlyNumberStringFromString:textField.text position:¤tPosition];

//限制字数

if (onlyNumberString.length > 11) {

textField.text = _lastText;

textField.selectedTextRange = _currentTextRange;

return;

}

NSString *phoneResultString = [self getPhoneResultFromSourceString:onlyNumberString position:¤tPosition];

textField.text = phoneResultString;

UITextPosition *targetPosition = [textField positionFromPosition:textField.beginningOfDocument offset:currentPosition];

UITextRange *range = [textField textRangeFromPosition:targetPosition toPosition:targetPosition];

textField.selectedTextRange = range;

}

/**

剔除非阿拉伯数字的函数

@param sourceString 需要校验的字符串

@param position 当前的光标位置

@return 处理后只包含阿拉伯数字的字符串

*/

- (NSString *)getOnlyNumberStringFromString:(NSString *)sourceString position:(NSInteger *)position

{

NSMutableString *mstr = [NSMutableString string];

NSInteger tempPosition = *position;

for (int i = 0 ; i < sourceString.length; i++) {

unichar character = [sourceString characterAtIndex:i];

//isdigit:检查参数c是否为阿拉伯数字0到9

if (isdigit(character)) {

//将unichar转为NSString

NSString *numberString = [NSString stringWithCharacters:&character length:1];

[mstr appendString:numberString];

}else{

//检测到非阿拉伯数字时,且遍历到的下标小于 当前光标位置,需要将当前光标的位置-1(计算纯阿拉伯数字的下标)

if (i < tempPosition) {

(*position)--;

}

}

}

return mstr.copy;

}

/**

指定位置添加分隔符号

@param soureceString 需要校验的字符串

@param position 当前的光标位置

@return 添加符号后的电话号码

*/

- (NSString *)getPhoneResultFromSourceString:(NSString *)soureceString position:(NSInteger *)position

{

NSMutableString *mstr = [NSMutableString string];

NSInteger tempPosition = *position;

for (int i = 0; i < soureceString.length; i++) {

if (i == 3 || i == 7) {

[mstr appendString:@"-"];

if (i < tempPosition) {

(*position)++;

}

}

unichar character = [soureceString characterAtIndex:i];

NSString *str = [NSString stringWithCharacters:&character length:1];

[mstr appendString:str];

}

return mstr.copy;

}

//MARK: - UITextFieldDelegate

//MARK: --输入框开始编辑时

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

{

_lastText = textField.text;

_currentTextRange = textField.selectedTextRange;

return YES;

}

//MARK: -

//MARK: --检测手机号码是否正确

- (BOOL)isCorrectPhoneNumber

{

[self resignFirstResponder];

//正则表达式(匹配手机号3-4-4格式)

NSString *pattren = @"^1[3578]+\\d-\\d{4}-\\d{4}";

//SELF MATCHES:匹配正则表达式

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",pattren];

//评估输入的手机号是否匹配

return [predicate evaluateWithObject:self.text];

}

调用方法:

- (IBAction)checkPhoneNumber:(id)sender {

if ([self.phoneTF isCorrectPhoneNumber]) {

NSLog(@"This is a correct phone number");

}else{

NSLog(@"This is a error phone number");

}

}



VecodeTextField:带计时器的验证码输入框

实现代码:

- (void)prepareTextFieldWithDefaultSetting

{

[super prepareTextFieldWithDefaultSetting];

self.keyboardType = UIKeyboardTypeNumberPad;

self.rightViewMode = UITextFieldViewModeAlways;

_button = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 100, 20)];

_button.backgroundColor = [UIColor whiteColor];

_button.titleLabel.font = [UIFont systemFontOfSize:12];

_button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentRight;

[_button setTitle:@"获取验证码" forState:UIControlStateNormal];

[_button setTitleColor:[UIColor lightGrayColor] forState:UIControlStateNormal];

[_button addTarget:self action:@selector(clickButton:) forControlEvents:UIControlEventTouchUpInside];

self.rightView = _button;

}

//MARK: -

//MARK: -- 点击获取验证码按钮

- (void)clickButton:(UIButton *)sender

{

sender.enabled = NO;

_second = 60;

if ([_vecodeDelegate respondsToSelector:@selector(clickButtonWithTextField:startTimer:reenableButton:)]) {

[_vecodeDelegate clickButtonWithTextField:self startTimer:@selector(startTimer) reenableButton:@selector(reenableButton)];

}

}

- (void)startTimer

{

_timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(countdown) userInfo:nil repeats:YES];

}

- (void)reenableButton

{

[self resetTextField];

}

- (void)countdown

{

_second--;

[self.button setTitle:[NSString stringWithFormat:@"%d",_second] forState:UIControlStateNormal];

if (_second < 0) {

[self resetTextField];

}

}

- (void)resetTextField

{

[_button setTitle:@"重获验证码" forState:UIControlStateNormal];

[_timer invalidate];

_second = 60;

_button.enabled = YES;

}

调用代理方法:

//MARK: -

//MARK: --VecodeTFDelegate

- (void)clickButtonWithTextField:(VecodeTextField *)textField startTimer:(SEL)startTimer reenableButton:(SEL)reenableButton

{

//开始倒计时

if ([textField respondsToSelector:startTimer]) {

[textField performSelector:startTimer];

}

self.reenableButton = reenableButton;

}

//MARK: -

//MARK: --停止计时器

- (IBAction)stopTimer:(id)sender {

if ([self.vecodeTF respondsToSelector:self.reenableButton]) {

[self.vecodeTF performSelector:self.reenableButton];

}

}

demo地址:戳我

喜欢请给个赞哦~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,039评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,223评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,916评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,009评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,030评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,011评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,934评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,754评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,202评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,433评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,590评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,321评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,917评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,568评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,738评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,583评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,482评论 2 352

推荐阅读更多精彩内容

  • 1、禁止手机睡眠[UIApplication sharedApplication].idleTimerDisabl...
    DingGa阅读 1,117评论 1 6
  • *7月8日上午 N:Block :跟一个函数块差不多,会对里面所有的内容的引用计数+1,想要解决就用__block...
    炙冰阅读 2,485评论 1 14
  • iOS开发系列--网络开发 概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博、微信等,这些应用本身可...
    lichengjin阅读 3,657评论 2 7
  • 今晚一个人搭高铁回家。到站已经九点半了。没有公交车。也没有人来接。一个人从一个车站坐到另一个车站,虽然不远,但是...
    青腻阅读 144评论 0 0
  • 土八 2016年的那个末夏,我认识的攀子毕业了。从四流野鸡大学浑浑噩噩地混了三年,东跑西走的游荡了一圈,像是...
    七明八目阅读 203评论 5 1