单行可编辑文本区域
创建
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;
}