[API] UITextField

单行可编辑文本区域

创建

CGRect textFieldFrame = CGRectMake(0, [UIApplication sharedApplication].statusBarFrame.size.height, 100, 50);
UITextField *textField = [[UITextField alloc] initWithFrame:textFieldFrame];

设置外观

  • 边框样式
textField.backgroundColor = [UIColor whiteColor];

// UITextBorderStyleNone : 只有在该样式下,设置背景图才会生效,且图片大小小于 textField 的frame时,图片会拉伸。
// UITextBorderStyleLine
// UITextBorderStyleBezel
// UITextBorderStyleRoundedRect
  • 背景色
textField.backgroundColor = [UIColor whiteColor];
  • 背景图片/ enable 为 NO 时背景图片
textField.borderStyle = UITextBorderStyleNone;
textField.background = [UIImage imageNamed:@"xxx.png"];
textField.disabledBackground = [UIImage imageNamed:@"xxxx.png"];
  • 覆盖 View(left & right & clearButton)
self.textField.leftView = leftOverlayButton;(rightView 同理)
self.textField.leftViewMode = UITextFieldViewModeAlways;

// UITextFieldViewModeNever
// UITextFieldViewModeWhileEditing
// UITextFieldViewModeUnlessEditing
// UITextFieldViewModeAlways

// clearButton 占据 rightView
// 所以当 rightView 和 clearButton 都有时,需要设置不同的 viewMode 防止显示冲突
textField.clearButtonMode = UITextFieldViewModeWhileEditing;
  • 重写绘图方法
    • - textRectForBounds:
      Returns the drawing rectangle for the text field’s text.

    • - drawTextInRect:
      Draws the receiver’s text in the specified rectangle.

    • - placeholderRectForBounds:
      Returns the drawing rectangle for the text field’s placeholder text

    • - drawPlaceholderInRect:
      Draws the receiver’s placeholder text in the specified rectangle.

    • - borderRectForBounds:
      Returns the receiver’s border rectangle.

    • - editingRectForBounds:
      Returns the rectangle in which editable text can be displayed.

    • - clearButtonRectForBounds:
      Returns the drawing rectangle for the built-in clear button.

    • - leftViewRectForBounds:
      Returns the drawing rectangle of the receiver’s left overlay view.

    • - rightViewRectForBounds:
      Returns the drawing location of the receiver’s right overlay view.

设置文本

  • 文本
textField.text = @"123";
textField.attributedText = [[NSAttributedString alloc] initWithString:@"123" 
                                                           attributes:@{NSForegroundColorAttributeName : [UIColor blackColor]}];
  • 占位文字
textField.placeholder = @"placeHolder";
textField.attributedPlaceholder  = [[NSAttributedString alloc] initWithString:@"placeholder"
                                                                   attributes:@{NSForegroundColorAttributeName : [UIColor grayColor]}];

格式化输入(属性 / 富文本)

富文本方式格式化
// 原始文本特性
textField.defaultTextAttributes = @{NSForegroundColorAttributeName : [UIColor blackColor]};
// 新输入文本特性
textField.typingAttributes = @{NSForegroundColorAttributeName : [UIColor blackColor]};
属性方式格式化
  • 字体
textField.font = [UIFont systemFontOfSize:13.0];
  • 文本颜色
textField.textColor = [UIColor grayColor];
  • 文本对齐方式
textField.textAlignment = NSTextAlignmentLeft;

// NSTextAlignmentLeft
// NSTextAlignmentCenter
// NSTextAlignmentRight
// NSTextAlignmentJustified
// NSTextAlignmentNatural
  • 暗码显示
textField.secureTextEntry = NO;
  • 文本大小自适应
textFiled.adjustsFontSizeToFitWidth = YES;
//设置文本最小字体,adjustsFontSizeToFitWidth == YES 时才起作用(默认0.0)
textFiled.minimumFontSize = 10;

管理输入行为(属性)

  • editing(readonly)
    表示现在是否在编辑状态

  • clearsOnBeginEditing
    控制开始编辑时是否清空旧文本

  • clearsOnInsertion
    控制插入文本时是否清空旧文本

  • allowsEditingTextAttributes
    控制是否可以输入富文本

键盘

  • 替换输入 View
textField.inputView = nil; // 设置成为 first responder 时显示的 View
  • 显示/收起 键盘
- becomeFirstResponder
- resignFirstResponder
  • 根据键盘尺寸调整视图
    • 接收键盘显示相关的 Notification , userInfo(dictionary) 中有键盘尺寸信息,根据尺寸信息调整视图
// already become first responder and began editing
[UIKeyboardWillShowNotification]
[UIKeyboardDidShowNotification]
[UIKeyboardWillChangeFrameNotification] (keyboard was already visible)
[UIKeyboardDidChangeFrameNotification] (keyboard was already visible)

// already resign first responder already and end editing
[UIKeyboardWillHideNotification]
[UIKeyboardDidHideNotification]
  • 设置键盘类型
textField.keyboardType = UIKeyboardTypeDefault;

常用
// UIKeyboardTypeDefault : 默认键盘,支持所有字符
// UIKeyboardTypePhonePad : 电话键盘
// UIKeyboardTypeNumberPad : 数字键盘
// UIKeyboardTypeEmailAddress : 邮件地址键盘

非常用
// UIKeyboardTypeASCIICapable : 支持ASCII的默认键盘
// UIKeyboardTypeNumbersAndPunctuation : 标准电话键盘,支持+*#字符
// UIKeyboardTypeURL : URL键盘,支持.com按钮 只支持URL字符
// UIKeyboardTypeNamePhonePad : 电话键盘,也支持输入人名
// UIKeyboardTypeDecimalPad : 数字键盘 有数字和小数点(IOS 4.1后可用)
// UIKeyboardTypeTwitter : 优化键盘,方便输入@、#字符,用于twitter文本输入(IOS 5.0后可用)
// UIKeyboardTypeWebSearch  : 支持添加链接的默认键盘类型(IOS 7.0之后可用)
// UIKeyboardTypeAlphabet = UIKeyboardTypeASCIICapable : 弃用
  • 设置换行键类型
textField.returnKeyType = UIReturnKeyDefault;

常用
// UIReturnKeyDefault : 灰色按钮[Return]
// UIReturnKeyDone : 蓝色按钮[Done]
// UIReturnKeySearch : 蓝色按钮[Search]
// UIReturnKeySend : 蓝色按钮[Send]
// UIReturnKeyJoin : 蓝色按钮[Join]
// UIReturnKeyNext : 蓝色按钮[Next]
// UIReturnKeyGo : 蓝色按钮[Go]

非常用
// UIReturnKeyGoogle : 蓝色按钮[Google](用于搜索)
// UIReturnKeyRoute : 蓝色按钮[Route]
// UIReturnKeyYahoo : 蓝色按钮[Yahoo]
// UIReturnKeyEmergencyCall : 紧急呼叫按钮
// UIReturnKeyContinue : 蓝色按钮[Continue](IOS 9.0后可用)
  • 设置键盘 亮 / 暗
textField.keyboardAppearance = UIKeyboardAppearanceDefault;

// UIKeyboardAppearanceDefault : 默认
// UIKeyboardAppearanceDark : 亮(IOS 7.0后可用)
// UIKeyboardAppearanceLight  : 暗(IOS 7.0后可用)
// UIKeyboardAppearanceAlert == UIKeyboardAppearanceDark : 弃用
  • 自动大写
textField.autocapitalizationType = UITextAutocapitalizationTypeNone;

// UITextAutocapitalizationTypeNone : 关闭
// UITextAutocapitalizationTypeWords : 单词
// UITextAutocapitalizationTypeSentences : 句子
// UITextAutocapitalizationTypeAllCharacters : 所有字母
  • 自动校正输入
textField.autocorrectionType = UITextAutocorrectionTypeNo;

// UITextAutocorrectionTypeDefault
// UITextAutocorrectionTypeNo
// UITextAutocorrectionTypeYes
  • 拼写建议
textField.spellCheckingType = UITextSpellCheckingTypeDefault;

// UITextSpellCheckingTypeDefault
// UITextSpellCheckingTypeNo
// UITextSpellCheckingTypeYes
  • 启用 / 禁用 换行键
// 默认是 NO ,换行键一直可用
// 设置为 YES ,没有输入文本时换行键被禁用
textField.enablesReturnKeyAutomatically = YES;

Delegate

确认文本和管理输入过程

  • 编辑过程方法
  • 是否允许开启编辑和结束编辑方法
  • 限制输入字符数量和内容的方法
  • 响应Clear Button和Keyboard Return Button的方法
具体方法
  • 成为 first responder 前
// 是否允许开始编辑
method : - textFieldShouldBeginEditing:
  • 成为 first responder 并开始编辑
// 显示键盘
notification : 
[UIKeyboardWillShowNotification]
[UIKeyboardDidShowNotification]
[UIKeyboardWillChangeFrameNotification] (keyboard was already visible)
[UIKeyboardDidChangeFrameNotification] (keyboard was already visible)

// 开始编辑
method : - textFieldDidBeginEditing
notification : [UITextFieldTextDidBeginEditingNotification]

// 编辑中
// 是否允许改变文本
method : - textField:shouldChangeCharactersInRange:replacementString:
notification : [UITextFieldTextDidChangeNotification]
  • 脱离 first responder 前
// 是否允许结束编辑
method : - textFieldShouldEndEditing:
  • 脱离 first responder 并结束编辑
// 隐藏键盘
notification : 
[UIKeyboardWillHideNotification]
[UIKeyboardDidHideNotification]

// end editing
method : - textFieldDidEndEditing:
notification : [UITextFieldTextDidEndEditingNotification]
  • 响应按钮
method : - textFieldShouldClear:
method : - textFieldShouldReturn:

Notification

  • UITextFieldTextDidBeginEditingNotification
    开始编辑的 textField 在参数中, userInfo dictionary 无效

  • UITextFieldTextDidChangeNotification
    文本变化的 textField 在参数中

  • UITextFieldTextDidEndEditingNotification
    结束编辑的 textField 在参数中, userInfo dictionary 无效

限制只能输入特定字符

(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
// 把可用字符放入 Set,取反
//invertedSet方法是去反字符,把所有的除了NUMBERS 里的字符都找出来(包含去空格功能)
NSCharacterSet *validCharactersSet = [[NSCharacterSet characterSetWithCharactersInString:NUMBERS]invertedSet];;

// 用 Set 中字符去拆分输入字符串并用""合并
NSString *filteredString = [[string componentsSeparatedByCharactersInSet: validCharactersSet]componentsJoinedByString:@""]; 

// 验证与原字符串是否一样,一样的话通过,不一样禁止
BOOL canChange = [string isEqualToString: filteredString];

return canChange;
}

#define NUMBERS @”0123456789n” (这个代表可以输入数字和换行,请注意这个n,如果不写这个,Done按键将不会触发,如果用在SearchBar中,将会不触发Search事件)
#define kAlphaNum   @”ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789″。

限制输入文本长度

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string; 
{ 
// textField 是此时正在输入的那个输入框
// string 是输入的字符串
// range 是输入字符串范围

// 允许按回车
if ([string isEqualToString:@"n"]) 
{ 
    return YES; 
} 
// 文本长度超过20后,禁止输入
if (self.myTextField == textField) 
{ 
    NSString * toBeString = [textField.text stringByReplacingCharactersInRange:range withString:string]; // 编辑后的文本
    if ([toBeString length] > 20) { 
        textField.text = [toBeString substringToIndex:20]; 
        return NO; 
    } 
} 
return YES; 
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容

  • 18- UIBezierPath官方API中文翻译(待校对) ----------------- 华丽的分割线 -...
    醉卧栏杆听雨声阅读 1,048评论 1 1
  • ViewsBecause view objects are the main way your applicati...
    梁光飞阅读 593评论 0 0
  • UIBezierPath Class Reference 译:UIBezierPath类封装了Core Graph...
    鋼鉄侠阅读 1,706评论 0 3
  • 告诉自己,自信一点,不要在意别人对你的看法,生活是你自己的,与别人何干?对已经过去的事,对任何人,都无需解释,因为...
    东方逸空_76b0阅读 166评论 0 0
  • 【1雨天相遇】 雨水像珠帘一样散落在地上,大地欢快地弹起豆粒大的雨点。 欢子颤抖着身子奋力向家的方向赶。 这雨像和...
    佳迪的音符阅读 238评论 4 1