UITextFied
是经常用到的一个控件。还是有一些点需要注意的。
基本属性
挑选一些可能会忘记需要查阅的常用的基本属性,可能不完全,比如背景色啊,占位符啊,设置和读取文字啊都没列入。
设置边框样式
1 | textField.borderStyle = UITextBorderStyleRoundedRect;//圆角 |
设置字体
1 | [textField setFont:[UIFont fontWithName:@"Arial" size:30]]; |
密文输入
1 | textField.secureTextEntry = YES; |
键盘类型
1 | textField.keyboardType = UIKeyboardTypeNumberPad; 数字键 |
键盘风格
1 | textView.keyboardAppearance=UIKeyboardAppearanceDefault; |
设置左右视图
textField
可以 leftView
和 rightView
,文本输入区域在两者之间。设置清除按钮样式
1 | textField.clearButtonMode = UITextFieldViewModeAlways; |
再次编辑时是否清除之前内容
1 | // 默认是NO |
对齐方式
垂直对齐:
1 | textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter |
水平对齐:
1 | textField.textAlignment = UITextAlignmentCenter; |
设置滚动
1 | textField.adjustsFontSizeToFitWidth = YES; |
默认是 NO。当是 YES当充满边框时,文字会缩小,当小到一定程度时仍然会滚动。
1 | textField.minimumFontSize = 20; |
设置滚动时候的最小字号。
设置return键
1 | textField.returnKeyType = UIReturnKeyGoogle;search |
文本编辑框代理
首先要注意,必须先设置当前 textField 的 delegate
,否则下面的回调无法响应。可以代码设置,也可以在 xib 中连当前 textField 的 delegate
到 file's owner
上。
是否进入编辑模式
1 | - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField |
默认返回YES,进入编辑模式。NO不进入编辑模式。
进入编辑模式
1 | - (void)textFieldDidBeginEditing:(UITextField *)textField |
是否退出编辑模式
1 | - (BOOL)textFieldShouldEndEditing:(UITextField *)textField |
默认返回YES,退出编辑模式。NO不退出编辑模式
退出编辑模式
1 | - (void)textFieldDidEndEditing:(UITextField *)textField |
点击清除按钮是否清空
1 | - (BOOL)textFieldShouldClear:(UITextField *)textField |
默认返回YES,返回NO不清除。
点击键盘上Return按钮时候调用
1 | - (BOOL)textFieldShouldReturn:(UITextField *)textField |
输入任何字符的时候调用该方法
1 | -(BOOL)textField:(UITextField *)field shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string |
当输入字符时,代理调用该方法,如果返回YES则这次输入可以成功,如果返回NO,不能输入成功。range表示光标位置,string表示这次输入的字符串。
一些技巧
全屏触摸关闭
监听手势,当点击开始时,关闭 textfield
1 | - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ |
如果你不能拿到 textfield 的实例,其实可以直接设置 endEditing
属性,表示结束编辑:
1 | [self.view endEditing:YES]; |
限制长度
使用上面的 shouldChangeCharactersInRange:
方法:
1 | - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ |
UITextField输入中文时文字下沉的解决方法
出现情况:在 xib 创建的 UITextField
中输入中文的时候,Border Style
这个属性设置为第一种 UITextBorderStyleNone
,同时 Clear Button
设置为 Never appears
时会出现这种情况
解决方法:可以设置 Clear Button
的出现时机,或者设置 Border Style
为其他类型 。如果一定要是这种 Border Style
和 Clear Button
,那么可以将 xib 中的 UITextField
拖出来,通过代码设置 Border Style
的方式设置其为UITextBorderStyleNone
(在 xib 中要先设置为其他的再在代码里这样设置才能成功)。
多个 UITextField 点击换行按钮,切换 FirstResponder
主要就是利用 textFieldShouldReturn:
这个回调方法:
1 | - (BOOL)textFieldShouldReturn:(UITextField *)textField{ |
textField 键盘遮挡界面上移
主要的思想就是监听键盘弹出和消失的通知,然后判断是否需要将屏幕上移。完整代码如下:
1 | - (void)viewDidLoad { |
设置 UITextField 的 Padding(leftview 和 rightview)
当设置 UITextField
为左对齐的时候,就会发现输入的字和 placeholder
会紧贴着左边框。想要将字往右移,可以利用好 leftView
和 rightView
这两个属性。
这两个属性会被放在 textField
的最左边和最右边。我们只要创建一个 UIView
然后赋值给 leftView
就可以了:
1 | UIView spacerView = [[UIView alloc] initWithFrame: CGRectMake(0, 0, 10, 10)]; |
注意这里要将 mode 设置为 UITextFieldViewModeAlways
,否则左视图无法显现出来。
点击事件,不触发弹出键盘,触发其他事件
就是不让直接修改,点击后触发自己的响应。只要实现代理方法就可以了:
1 | - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{ |
先完成自己的操作,然后设置这个 textField
不能响应。