前言
NS_CLASS_AVAILABLE_IOS(2_0) @interface UITextField : UIControl <UITextInput, NSCoding>
@available(iOS 2.0, *) public class UITextField : UIControl, UITextInput, NSCoding
1、UITextField 的创建
Objective-C
// 实例化 UITextField 对象 UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(20, 100, 200, 30)]; // 将 textField 加到 window 上显示出来 [self.view addSubview:textField];
Swift
// 实例化 UITextField 对象 let textField:UITextField = UITextField(frame: CGRectMake(20, 100, 200, 30)) // 将 textField 加到 window 上显示出来 self.view.addSubview(textField)
2、UITextField 的设置
Objective-C
// 设置边框样式 /* UITextBorderStyleNone, 无边框,默认 UITextBorderStyleLine, 直线边框 UITextBorderStyleBezel, 边框 + 阴影 UITextBorderStyleRoundedRect 圆角矩形边框 */ textField.borderStyle = UITextBorderStyleLine; // 设置背景颜色 /* 默认是透明的 */ textField.backgroundColor = [UIColor yellowColor]; // 设置背景图片 textField.background = [UIImage imageNamed:@"pic2"]; // 设置提示文字 /* 用户输入时自动消失 */ textField.placeholder = @"请输入用户名"; // 设置输入的字体颜色 textField.textColor = [UIColor redColor]; // 设置文字对齐方式 textField.textAlignment = NSTextAlignmentLeft; // 设置最小可缩小的字号 textField.minimumFontSize = 10; // 自动调整文字大小 /* 自动调整文字的大小以适应 textField 的宽度 */ textField.adjustsFontSizeToFitWidth = YES; // 设置密文输入模式 /* default is NO */ textField.secureTextEntry = YES; // 设置显示清除按钮 /* UITextFieldViewModeNever, // default UITextFieldViewModeWhileEditing, UITextFieldViewModeUnlessEditing, UITextFieldViewModeAlways */ textField.clearButtonMode = UITextFieldViewModeWhileEditing; // 设置键盘样式 /* UIKeyboardTypeDefault, // Default type for the current input method. UIKeyboardTypeASCIICapable, // Displays a keyboard which can enter ASCII characters, // non-ASCII keyboards remain active UIKeyboardTypeNumbersAndPunctuation, // Numbers and assorted punctuation. UIKeyboardTypeURL, // A type optimized for URL entry. UIKeyboardTypeNumberPad, // A number pad (0-9). Suitable for PIN entry. UIKeyboardTypePhonePad, // A phone pad (1-9, *, 0, #, with letters under the numbers). UIKeyboardTypeNamePhonePad, // A type optimized for entering a person's name or phone number. UIKeyboardTypeEmailAddress, // A type optimized for multiple email address entry. UIKeyboardTypeDecimalPad, // A number pad with a decimal point. UIKeyboardTypeTwitter, // A type optimized for twitter text entry (easy access to @ #) UIKeyboardTypeWebSearch, // A default keyboard type with URL-oriented addition. UIKeyboardTypeAlphabet = UIKeyboardTypeASCIICapable, // Deprecated */ textField.keyboardType = UIKeyboardTypeDefault; // 设置返回键样式 /* UIReturnKeyDefault, UIReturnKeyGo, UIReturnKeyGoogle, UIReturnKeyJoin, UIReturnKeyNext, UIReturnKeyRoute, UIReturnKeySearch, UIReturnKeySend, UIReturnKeyYahoo, UIReturnKeyDone, UIReturnKeyEmergencyCall, UIReturnKeyContinue NS_ENUM_AVAILABLE_IOS(9_0), */ textField.returnKeyType = UIReturnKeyJoin; // 设置输入的字母大小写模式 /* UITextAutocapitalizationTypeNone, UITextAutocapitalizationTypeWords, UITextAutocapitalizationTypeSentences, UITextAutocapitalizationTypeAllCharacters, */ textField.autocapitalizationType = UITextAutocapitalizationTypeWords; // 设置左右视图显示模式 /* 不设置模式,左右视图显示不出来 UITextFieldViewModeNever, UITextFieldViewModeWhileEditing, UITextFieldViewModeUnlessEditing, UITextFieldViewModeAlways */ textField.leftViewMode = UITextFieldViewModeAlways; textField.rightViewMode = UITextFieldViewModeAlways; // 设置左右视图 textField.leftView = label1; textField.rightView = label2; // 让 textField 获取第一响应 /* 打开应用程序或界面时直接弹出键盘 */ [textField becomeFirstResponder]; // 让 textField 放弃第一响应 /* 收起键盘 */ [textField resignFirstResponder]; // 设置 textField 的代理,需遵守协议 <UITextFieldDelegate> textField.delegate = self;
Swift
// 设置边框样式 /* case None 无边框,默认 case Line 直线边框 case Bezel 边框 + 阴影 case RoundedRect 圆角矩形边框 */ textField.borderStyle = .Line // 设置背景颜色 /* 默认是透明的 */ textField.backgroundColor = UIColor.yellowColor() // 设置背景图片 textField.background = UIImage(named: "pic2") // 设置提示文字 /* 用户输入时自动消失 */ textField.placeholder = "请输入用户名" // 设置输入的字体颜色 textField.textColor = UIColor.redColor() // 设置文字对齐方式 textField.textAlignment = NSTextAlignment.Left // 设置最小可缩小的字号 textField.minimumFontSize = 10 // 自动调整文字大小 /* 自动调整文字的大小以适应 textField 的宽度 */ textField.adjustsFontSizeToFitWidth = true // 设置密文输入模式 /* default is NO */ textField.secureTextEntry = true // 设置显示清除按钮 /* case Never // default case WhileEditing case UnlessEditing case Always */ textField.clearButtonMode = .WhileEditing // 设置键盘样式 /* case Default // Default type for the current input method. case ASCIICapable // Displays a keyboard which can enter ASCII characters, // non-ASCII keyboards remain active case NumbersAndPunctuation // Numbers and assorted punctuation. case URL // A type optimized for URL entry. case NumberPad // A number pad (0-9). Suitable for PIN entry. case PhonePad // A phone pad (1-9, *, 0, #, with letters under the numbers). case NamePhonePad // A type optimized for entering a person's name or phone number. case EmailAddress // A type optimized for multiple email address entry. case DecimalPad // A number pad with a decimal point. case Twitter // A type optimized for twitter text entry (easy access to @ #) case WebSearch // A default keyboard type with URL-oriented addition. public static var Alphabet: UIKeyboardType { get } // Deprecated */ textField.keyboardType = .Default // 设置返回键样式 /* case Default case Go case Google case Join case Next case Route case Search case Send case Yahoo case Done case EmergencyCall case Continue */ textField.returnKeyType = .Join // 设置输入的字母大小写模式 /* case None case Words case Sentences case AllCharacters */ textField.autocapitalizationType = .Words // 设置左右视图显示模式 /* 不设置模式,左右视图显示不出来 case Never case WhileEditing case UnlessEditing case Always */ textField.leftViewMode = .Always textField.rightViewMode = .Always // 设置左右视图 textField.leftView = label1 textField.rightView = label2 // 让 textField 获取第一响应 /* 打开应用程序或界面时直接弹出键盘 */ textField.becomeFirstResponder() // 让 textField 放弃第一响应 /* 收起键盘 */ textField.resignFirstResponder() // 设置 textField 的代理,需遵守协议 UITextFieldDelegate textField.delegate = self
3、textField 协议方法
协议方法,需遵守协议 UITextFieldDelegate,并设置代理
Objective-C
// 将要开始编辑,编辑开始前被调用 - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { return YES; } // 已经开始编辑,编辑开始后被调用,可监听键盘的弹出 - (void)textFieldDidBeginEditing:(UITextField *)textField { } // 将要结束编辑,编辑结束前被调用 - (BOOL)textFieldShouldEndEditing:(UITextField *)textField { return YES; } // 已经结束编辑,编辑结束后被调用,可监听键盘的回收 - (void)textFieldDidEndEditing:(UITextField *)textField { // 输出 textfield 中输入的内容 NSLog(@"您输入的内容为:%@", textField.text); } // 是否允许文本修改,文本修改前被调用 /* NO 不允许输入,YES 允许输入(默认) range:光标范围 string:当前输入的内容 */ - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { return YES; } // 返回,键盘上的 return 键触摸后调用 - (BOOL)textFieldShouldReturn:(UITextField *)textField { return YES; } // 清空,文本输入框中清除按钮被触摸时调用 - (BOOL)textFieldShouldClear:(UITextField *)textField { return YES; }
Swift
// 将要开始编辑,编辑开始前被调用 func textFieldShouldBeginEditing(textField: UITextField) -> Bool { return true } // 已经开始编辑,编辑开始后被调用,可监听键盘的弹出 func textFieldDidBeginEditing(textField: UITextField) { } // 将要结束编辑,编辑结束前被调用 func textFieldShouldEndEditing(textField: UITextField) -> Bool { return true } // 已经结束编辑,编辑结束后被调用,可监听键盘的回收 func textFieldDidEndEditing(textField: UITextField) { // 输出 textfield 中输入的内容 print("您输入的内容为:\(textField.text)") } // 是否允许文本修改,文本修改前被调用 /* false 不允许输入,true 允许输入(默认) range:光标范围 string:当前输入的内容 */ func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { return true } // 返回,键盘上的 return 键触摸后调用 func textFieldShouldReturn(textField: UITextField) -> Bool { return true } // 清空,文本输入框中清除按钮被触摸时调用 func textFieldShouldClear(textField: UITextField) -> Bool { return true }
4、textField 的键盘回收
Objective-C
触摸手势回收
- 用触摸手势或表格滚动方式回收键盘,触摸界面或滚动表格视图时键盘消失
// 单一 textField 回收键盘 // 让 textField 放弃第一响应,收起键盘 [textField resignFirstResponder]; // 所有 textField 都回收键盘 [self.view endEditing:YES];
return 键回收
- 用代理方式回收键盘(键盘上的 return 键回收键盘),需遵守协议 UITextFieldDelegate,并设置代理
// 设置 textField 的代理 textField1.delegate = self; textField2.delegate = self; // UITextFieldDelegate 协议方法返回,键盘上的 return 键点击后调用 - (BOOL)textFieldShouldReturn:(UITextField *)textField { UITextField *textField_1 = (id)[self.view viewWithTag:200]; UITextField *textField_2 = (id)[self.view viewWithTag:300]; if (textField == textField_1) { // 让 textField_2 获取第一响应 // 点击 textfield_1 上的 return 键时,输入光标自动跳转到 textfield_2 内 [textField_2 becomeFirstResponder]; } else{ // 让 textField_2 放弃第一响应 // 点击 textfield_2 上的 return 键时,键盘回收 [textField_2 resignFirstResponder]; } return YES; }
Swift
触摸手势回收
- 用触摸手势或表格滚动方式回收键盘,触摸界面或滚动表格视图时键盘消失
// 单一 textField 回收键盘 // 让 textField 放弃第一响应,收起键盘 textField.resignFirstResponder() // 所有 textField 都回收键盘 self.view.endEditing(true)
return 键回收
- 用代理方式回收键盘(键盘上的 return 键回收键盘),需遵守协议 UITextFieldDelegate,并设置代理
// 设置 textField 的代理 textField1.delegate = self textField2.delegate = self // UITextFieldDelegate 协议方法返回,键盘上的 return 键点击后调用 func textFieldShouldReturn(textField: UITextField) -> Bool { let textField_1:UITextField = self.view.viewWithTag(200) as! UITextField let textField_2:UITextField = self.view.viewWithTag(300) as! UITextField if textField == textField_1 { // 让 textField_2 获取第一响应 // 点击 textfield_1 上的 return 键时,输入光标自动跳转到 textfield_2 内 textField_2.becomeFirstResponder() } else{ // 让 textField_2 放弃第一响应,点击 textfield_2 上的 return 键时,键盘回收 textField_2.resignFirstResponder() } return true }
5、textField 视图的上升/下降
Objective-C
用系统观察者控制
可以获取到键盘的高度和键盘弹起和隐藏的时间
多个观察者
// 添加系统通知观察者(检测键盘的显示与隐藏) // 检测键盘的弹起 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardShow:) name:UIKeyboardWillShowNotification object:nil]; // 检测键盘的隐藏 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardHide:) name:UIKeyboardWillHideNotification object:nil]; // 键盘弹起事件处理 - (void)keyboardShow:(NSNotification *)notification { // 取出键盘最终的高度 CGFloat keyboardHeight = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue].size.height; // 取出键盘弹出需要花费的时间 double duration = [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]; // 设置当前视图的 frame CGRect frame = self.view.frame; frame.origin.y = -keyboardHeight; [UIView animateWithDuration:duration animations:^{ self.view.frame = frame; }]; } // 键盘隐藏事件处理 - (void)keyboardHide:(NSNotification *)notification { // 取出键盘弹出需要花费的时间 double duration = [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]; // 设置当前视图的 frame CGRect frame = self.view.frame; frame.origin.y = 0; [UIView animateWithDuration:duration animations:^{ self.view.frame = frame; }]; }
单一观察者
// 添加系统通知观察者(检测键盘的 frame 改变) [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil]; // 键盘弹起隐藏事件处理 - (void)keyboardWillChangeFrame:(NSNotification *)notification { // 取出键盘最终的 frame CGRect rect = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue]; // 取出键盘弹出需要花费的时间 double duration = [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]; // 设置当前视图的 frame CGRect frame = self.view.frame; frame.origin.y = -([UIScreen mainScreen].bounds.size.height - rect.origin.y); [UIView animateWithDuration:duration animations:^{ self.view.frame = frame; }]; }
视图上升或下降处理
设置 frame
CGRect frame = self.view.frame; frame.origin.y = -keyboardHeight; [UIView animateWithDuration:duration animations:^{ self.view.frame = frame; }];
设置 约束值
self.bottomSpacing.constant = rect.size.height; [UIView animateWithDuration:duration animations:^{ [self.view layoutIfNeeded]; }];
设置 transform 属性
[UIView animateWithDuration:duration animations:^{ CGFloat ty = [UIScreen mainScreen].bounds.size.height - rect.origin.y; self.view.transform = CGAffineTransformMakeTranslation(0, -ty); }];
用协议方法控制
// 开始编辑 - (void)textFieldDidBeginEditing:(UITextField *)textField { // 获取当前视图的 frame CGRect frame = self.view.frame; frame.origin.y = -53; [UIView animateWithDuration:0.5 animations:^{ self.view.frame = frame; }]; } // 结束编辑 - (void)textFieldDidEndEditing:(UITextField *)textField { CGRect frame = self.view.frame; frame.origin.y = 0; [UIView animateWithDuration:0.5 animations:^{ self.view.frame = frame; }]; }
Swift
用系统观察者控制
可以获取到键盘的高度和键盘弹起和隐藏的时间
多个观察者
// 添加系统通知观察者(检测键盘的显示与隐藏) // 检测键盘的弹起 NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(UiTextField.keyboardShow(_:)), name: UIKeyboardWillShowNotification, object: nil) // 检测键盘的隐藏 NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(UiTextField.keyboardHide(_:)), name: UIKeyboardWillHideNotification, object: nil) // 键盘弹起事件处理 func keyboardShow(notification:NSNotification) { // 取出键盘最终的高度 let keyboardHeight:CGFloat = (notification.userInfo![UIKeyboardFrameEndUserInfoKey]?.CGRectValue().size.height)! // 取出键盘弹出需要花费的时间 let duration:Double = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey]!.doubleValue // 设置当前视图的 frame var frame:CGRect = self.view.frame frame.origin.y = -keyboardHeight UIView.animateWithDuration(duration) { self.view.frame = frame } } // 键盘隐藏事件处理 func keyboardHide(notification:NSNotification) { // 取出键盘弹出需要花费的时间 let duration:Double = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey]!.doubleValue // 设置当前视图的 frame var frame:CGRect = self.view.frame frame.origin.y = 0 UIView.animateWithDuration(duration) { self.view.frame = frame } }
单一观察者
// 添加系统通知观察者(检测键盘的 frame 改变) NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(UiTextField.keyboardWillChangeFrame(_:)), name: UIKeyboardWillChangeFrameNotification, object: nil) // 键盘弹起隐藏事件处理 func keyboardWillChangeFrame(notification:NSNotification) { // 取出键盘最终的高度 let rect:CGRect = (notification.userInfo![UIKeyboardFrameEndUserInfoKey]?.CGRectValue())! // 取出键盘弹出需要花费的时间 let duration:Double = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey]!.doubleValue // 设置当前视图的 frame var frame:CGRect = self.view.frame frame.origin.y = -(UIScreen.mainScreen().bounds.size.height - rect.origin.y) UIView.animateWithDuration(duration) { self.view.frame = frame } }
视图上升或下降处理
设置 frame
var frame:CGRect = self.view.frame frame.origin.y = -keyboardHeight UIView.animateWithDuration(duration) { self.view.frame = frame }
设置 约束值
self.bottomSpacing.constant = rect.size.height UIView.animateWithDuration(duration) { self.view.layoutIfNeeded() }
设置 transform 属性
UIView.animateWithDuration(duration) { let ty:CGFloat = UIScreen.mainScreen().bounds.size.height - rect.origin.y self.view.transform = CGAffineTransformMakeTranslation(0, -ty) }
用协议方法控制
// 开始编辑 func textFieldDidBeginEditing(textField: UITextField) { // 获取当前视图的 frame var frame:CGRect = self.view.frame frame.origin.y = -53 UIView.animateWithDuration(0.5) { self.view.frame = frame } } // 结束编辑 func textFieldDidEndEditing(textField: UITextField) { var frame:CGRect = self.view.frame frame.origin.y = 0 UIView.animateWithDuration(0.5) { self.view.frame = frame } }
6、计算键盘高度
不同型号的 iOS 设备的键盘尺寸:
Type | iPhone 6(s) Plus | iPhone 6(s) | iPhone 5(s/c)/4(s)/SE
------------------------|:----------------:|:------------:|:-----------------------:
Default | | |
ASCIICapable | | |
NumbersAndPunctuation | | |
URL | 271 | 258 | 253
EmailAddress | | |
Twitter | | |
WebSearch | | |
Alphabet | | |
------------------------|------------------|--------------|-------------------------
NumberPad | | |
PhonePad | 226 | 216 | 216
NamePhonePad | | |
DecimalPad | | |Objective-C
// 在系统观察者响应方法中,获取观察的信息 NSDictionary *userInfo = notification.userInfo; CGFloat keyboardHeight = [userInfo[@"UIKeyboardFrameEndUserInfoKey"] CGRectValue].size.height;
Swift
// 在系统观察者响应方法中,获取观察的信息 let userInfo = notification.userInfo! let keyboardHeight = userInfo["UIKeyboardFrameEndUserInfoKey"]?.CGRectValue().size.height
7、Storyboard 中设置
在 Storyboard 场景中设置
Text Field 设置
Text | 文字类型及文字
-------------------------------|-------------------
Color | 文字颜色
Font | 文字字体
Alignment | 文字对齐方式
Placeholder | 占位文字
|
Background | 背景图片
Disabled | 无效状态背景图片
|
Border Style | 边框类型
|
Clear Button | 清除按钮显示时间
-- Clear when editing begins | 开始编辑时显示清楚按钮
|
Min Font Size | 最小字体大小
-- Adjust to Fit | 自动调整文字大小
|
Capitalization | 大小写模式
Correction | 自动纠正
Spell Checking | 拼写检查
Keyboard Type | 键盘样式
Appearance |
Return Key | 返回键样式
-- Auto-enable Return Key | 自动使能返回键
-- Secure Text Entry | 密文输入Control 设置
Alignment | 文字对齐方式
-------------------------------|-------------------
Content |
-- Selected | 选中
-- Enable | 可用
-- Highlighted | 高亮