多语言展示
当前在线:347今日阅读:168今日分享:49

iOS开发之---“ UITextField”

说到“UITextField”,那要说的东西就太多太多了,UITextField主要是用来输入文字的文本框,这就会涉及到输入框、搜索框、键盘、二级键盘的定制、监听事件........ ,自然UITextField也是ios开发中重要控件之一;
工具/原料
1

Mac / Mac mini

2

Xcode

方法/步骤
1

先来总结一下UITextField的属性:一.==初始化 创建UITextField===<1> 直接构造 时 指定位置  及 大小        UITextField *nameField = [[UITextField alloc] initWithFrame:CGRectMake(50, 150 , 275, 40)];<2>也可以通过中心点来确定文本框的位置         UITextField *field = [[UITextField alloc]initWithFrame:CGRectMake(0, 0 , 275, 40)];    field.center = CGPointMake(180, 400); <3>设置文本框文字    field.text = @"你好";    //文本框输入的文字的颜色(不写时  默认黑色)   field.textColor = [UIColor blackColor];  //光标的颜色      nameField.tintColor = [UIColor blueColor];   //文本框的背景颜色(默认 白色  )   field.backgroundColor = [UIColor brownColor]; <4>设置文本框文字大小    field.font = [UIFont systemFontOfSize:30];   //设置UITextField的文字大小和字体     field.font=[UIFont fontWithName:@"Times New Roman" size:20];    //根据输入文字动态调整字体大小,需要设置一个最小字体大小    textField.adjustsFontSizeToFitWidth = YES;    textField.minimumFontSize = 10.0;  //设置最小字体<5>文本框文字的对齐方式( 0 - 居左 , 1 -居中 , 2 -居右) field.textAlignment = NSTextAlignmentCenter;//也可以写成 field.textAlignment = 1;<6>文本框是否可编辑  不写时  默认 YES 可编辑    field.enabled = NO;  <7> 输入框默认输入文本,有时需求UITextField只可显示不可编辑的,此时起展示作用:用此属性设置需要显示的文本然后设置UITextField不可交互  textField.userInteractionEnabled = NO; 二.====用tag给文本框做一个标记====       //做标记        nameField.tag = 500;       //通过标记 找到UITextField       UITextField *field =(UITextField *)[self.view viewWithTag:500];三、=== 指定文本框的边框样试====      <1>为圆角矩形(默认  经典   文本框背景为白色    扁平化设计 )            nameField.borderStyle = UITextBorderStyleRoundedRect;     //枚举    typedef NS_ENUM(NSInteger, UITextBorderStyle) {             UITextBorderStyleNone,             UITextBorderStyleLine,            UITextBorderStyleBezel,             UITextBorderStyleRoundedRect   //默认  经典};      <2>可以定制边框           //===边框线条的粗细          field.layer.borderWidth = 1;         //====边框线倒角        field.layer.cornerRadius = 10;        //====边框线条颜色       field.layer.borderColor = [UIColor grayColor].CGColor;四、====输入设置===========  <1> ====设置文本框的占位文字     nameField.placeholder = @“请输入您的名字”;//===占位文字的字体颜色颜色====    textField.placeholder = @"密码输入框";  // ====方法一:(运行时)[textField setValue:[UIColor colorWithRed:79/255.0f green:79/255.0f blue:79/255.0f alpha:0.5f] forKeyPath:@"_placeholderLabel.textColor"]; [textField setValue:[UIFont boldSystemFontOfSize:20] forKeyPath:@"_placeholderLabel.font"]; //===方法二:(富文本) textField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"密码输入框"   attributes:@{NSForegroundColorAttributeName: [UIColor colorWithRed:79/255.0f green:79/255.0f blue:79/255.0f alpha:0.5f],NSFontAttributeName : [UIFont systemFontOfSize:20 weight:6],}];//===方法三:将占位文字画上去(重写- (void)drawPlaceholderInRect:(CGRect)rect;)- (void)drawPlaceholderInRect:(CGRect)rect {        [[UIColor orangeColor] set];        [self.placeholder drawInRect:rect withFont:[UIFont systemFontOfSize:20]]; } <2>设置将文字显示成掩码(密码框)    nameField.secureTextEntry = YES;<3> 设置清除按钮的模式(有文字就有清除按钮)    nameField.clearButtonMode = UITextFieldViewModeAlways;//枚举typedef NS_ENUM(NSInteger, UITextFieldViewMode) {    //无论什么时候 清除按钮都不显示    UITextFieldViewModeNever,   //只有编辑模式下 有文字才显示  编辑结束后不现实   UITextFieldViewModeWhileEditing,  //编辑的时候不显示编辑完成后(放弃第一响应者)才显示    UITextFieldViewModeUnlessEditing,   //上面有文字就显示,编辑结束后也显示(放弃第一响应者)    UITextFieldViewModeAlways };如下图:

2

五、=====在文本框中加入图片(image)========【注意】图片  png格式的图片可以不加后缀 , jpg 和gif都要加后缀//==创建一个UIImageView类型的图片视图imageView  并指定大小  UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 5, 30, 30)];  //添加图片  imageView.image = [UIImage imageNamed:@"Dudu.jpg"]; // 定制文本框的左视图(把图片设置到文本框左边) nameField.leftView = imageView; nameField.leftViewMode = UITextFieldViewModeAlways;(【注意】模式)//定制文本框的有视图(把图片设置到文本框右边)nameField.rightView = imageView;文本图片设置://枚举typedef NS_ENUM(NSInteger, UITextFieldViewMode) {    //无论什么时候 清除按钮都不显示    UITextFieldViewModeNever,   //只有编辑模式下 有文字才显示  编辑结束后不现实   UITextFieldViewModeWhileEditing,  //编辑的时候不显示编辑完成后(放弃第一响应者)才显示    UITextFieldViewModeUnlessEditing,   //上面有文字就显示,编辑结束后也显示(放弃第一响应者)    UITextFieldViewModeAlways };如下图:

3

六、设置占位文字的偏移重写-(CGRect)placeholderRectForBounds:(CGRect)bounds;方法可以用来设置光标与占位的间距//控制placeHolder的位置,左右缩20-(CGRect)placeholderRectForBounds:(CGRect)bounds {       //return CGRectInset(bounds, 20, 0);       CGRect inset = CGRectMake(bounds.origin.x+50, bounds.origin.y, bounds.size.width -10, bounds.size.height);   //更好理解些       return inset; }扩充:系统还提供了很多类似的方法– textRectForBounds:  //重写来重置文字区域– drawTextInRect:       //改变绘文字属性.重写时调用super可以按默认图形属性绘制,若自己完全重写绘制函数,就不用调用super了.– placeholderRectForBounds:  //重写来重置占位符区域– drawPlaceholderInRect:  //重写改变绘制占位符属性.重写时调用super可以按默认图形属性绘制,若自己完全重写绘制函数,就不用调用super了– borderRectForBounds:  //重写来重置边缘区域– editingRectForBounds:  //重写来重置编辑区域– clearButtonRectForBounds:  //重写来重置clearButton位置,改变size可能导致button的图片失真– leftViewRectForBounds:– rightViewRectForBounds:

4

利用Runtime获取私有的属性名称,利用KVC设置属性 来设置展位文字的颜色// 设置占位文字的颜色为红色(注意下面的'self'代表你要修改占位文字的UITextField控件)[self setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];完整代码:自定义的UITextField,获取到焦点(编辑状态)的时候是白色,失去焦点(非编辑状态)的时候是灰色://==================================#import "YCTextField.h"#import #define YCplaceholderTextColor @"_placeholderLabel.textColor"@implementation YCTextField+ (void)initialize {        [self getIvars]; }// 获取私有变量名称+ (void)getIvars {         unsigned int count = 0;          Ivar *ivars = class_copyIvarList([UITextField class], &count);         for (int i = 0; i < count; i++) {                   Ivar ivar = ivars[i];                    NSLog(@"%s----%s", ivar_getName(ivar),             ivar_getTypeEncoding(ivar));          } }  - (void)awakeFromNib {          // 设置光标的颜色          self.tintColor = self.textColor; }// 获取到焦点- (BOOL)becomeFirstResponder {          // 利用运行时获取key,设置占位文字的颜色         [self setValue:self.textColor forKeyPath:YCplaceholderTextColor];        return [super becomeFirstResponder]; }// ===失去焦点====- (BOOL)resignFirstResponder {        // 利用运行时获取key,设置占位文字的颜色         [self setValue:[UIColor grayColor] forKeyPath:YCplaceholderTextColor];          return [super resignFirstResponder]; }@end//原理如下图

5

iOS 输入框(UITextField)===密码明暗文切换====在做明暗文切换(密码输入框)的时候遇见一个坑,就是切换secureTextEntry的时候,输入框的光标会偏移,下面列出了一个解决办法及一种明暗文切换的方法

6

切换到密文状态,再次编辑时,内容清空重现:1.切换明密文状态,最后在密文状态,再次编辑,输入任意字符,内容清空;2.其他textField获取焦点,再切回来(密文状态),内容清空解决方法:如下图

7

====键盘样式=========与键盘相关的属性 textField.keyboardType = UIKeyboardTypeNumberPad;   //=========设置键盘的样式 =========   typedef enum {        UIKeyboardTypeDefault,       默认键盘,支持所有字符        UIKeyboardTypeASCIICapable,  支持ASCII的默认键盘        UIKeyboardTypeNumbersAndPunctuation,  标准电话键盘,支持+*#字符       UIKeyboardTypeURL,            URL键盘,支持.com按钮 只支持URL字符        UIKeyboardTypeNumberPad,              数字键盘        UIKeyboardTypePhonePad,    电话键盘        UIKeyboardTypeNamePhonePad,   电话键盘,也支持输入人名        UIKeyboardTypeEmailAddress,   用于输入电子 邮件地址的键盘        UIKeyboardTypeDecimalPad,     数字键盘 有数字和小数点       UIKeyboardTypeTwitter,        优化的键盘,方便输入@、#字符        UIKeyboardTypeAlphabet = UIKeyboardTypeASCIICapable,    } UIKeyboardType;  ===首字母是否自动大写=====autocapitalizationType  设置 UITextField的自动大写功能, none:关闭大写功能 words: 单词 sentences: 句子 allcharacters:所有字母 四种类型 textField.autocapitalizationType = UITextAutocapitalizationTypeNone; //枚举typedef enum {        UITextAutocapitalizationTypeNone, 不自动大写        UITextAutocapitalizationTypeWords,  单词首字母大写        UITextAutocapitalizationTypeSentences,  句子的首字母大写        UITextAutocapitalizationTypeAllCharacters, 所有字母都大写 } UITextAutocapitalizationType;=======键盘外观========textField.keyboardAppearance=UIKeyboardAppearanceDefault; //枚举  typedef enum {        UIKeyboardAppearanceDefault, 默认外观,浅灰色        UIKeyboardAppearanceAlert,     深灰 石墨色} UIReturnKeyType;    =====return键变成什么键=======改变 键盘“返回”键的类型   "返回"变为"完成"textField.returnKeyType =UIReturnKeyDone;  //枚举typedef enum {        UIReturnKeyDefault,    默认 灰色按钮,标有Return        UIReturnKeyGo,         标有Go的蓝色按钮        UIReturnKeyGoogle,    标有Google的蓝色按钮,用语搜索        UIReturnKeyJoin,      标有Join的蓝色按钮        UIReturnKeyNext,     标有Next的蓝色按钮        UIReturnKeyRoute,     标有Route的蓝色按钮        UIReturnKeySearch,     标有Search的蓝色按钮        UIReturnKeySend,      标有Send的蓝色按钮        UIReturnKeyYahoo,     标有Yahoo的蓝色按钮        UIReturnKeyYahoo,          标有Yahoo的蓝色按钮        UIReturnKeyEmergencyCall,     紧急呼叫按钮 } UIReturnKeyType;=======是否自动纠错=======autocorrectionType  启用/禁用 UITextFieldUI想的拼写建议功能,根据用户输入错误的单词提供修改建议 textField.autocorrectionType = UITextAutocorrectionTypeNo;     typedef enum {                UITextAutocorrectionTypeDefault, 默认        UITextAutocorrectionTypeNo,   不自动纠错        UITextAutocorrectionTypeYes,  自动纠错    } UITextAutocorrectionType;【点击键盘上的Return按钮的回调】 -(BOOL)textFieldShouldReturn:(UITextField *)textField{               //返回一个BOOL值,指明是否允许在按下回车键时结束编辑                 //如果允许要调用resignFirstResponder 方法,这回导致结束编辑,而键盘会被收起[textField resignFirstResponder];             查一下resign这个单词的意思就明白这个方法了            return YES;      }

8

=====委托的相关方法介绍    UITextFieldDelegate =====// 给文本框设置委托fd.delegate = self;   - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{             //返回一个BOOL值,指定是否循序文本字段开始编辑             return YES;    }    - (void)textFieldDidBeginEditing:(UITextField *)textField{             //开始编辑时触发,文本字段将成为first responder    }    - (BOOL)textFieldShouldEndEditing:(UITextField *)textField{               //返回BOOL值,指定是否允许文本字段结束编辑,当编辑结束,文本字段会让出first responder             //要想在用户结束编辑时阻止文本字段消失,可以返回NO            //这对一些文本字段必须始终保持活跃状态的程序很有用,比如即时消息           return NO;    }   【重要  文字改变时的回调】 - (BOOL)textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{              //当用户使用自动更正功能,把输入的文字修改为推荐的文字时,就会调用这个方法。                  //要防止文字被改变可以返回NO           //这个方法的参数中有一个NSRange对象,指明了被改变文字的位置,建议修改的文本也在其中            return YES;    }    - (BOOL)textFieldShouldClear:(UITextField *)textField{           //返回一个BOOL值指明是否允许根据用户请求清除内容            //可以设置在特定条件下才允许清除内容            return YES;    }     【点击键盘上的Return按钮的回调】 -(BOOL)textFieldShouldReturn:(UITextField *)textField{               //返回一个BOOL值,指明是否允许在按下回车键时结束编辑                 //如果允许要调用[resign FirstResponder]方法,这回导致结束编辑,而键盘会被收起[textField resignFirstResponder];         [textField resignFirstResponder];    //点击键盘上的return后键盘消失      return YES;      }

9

=========二级键盘的定制=============通过view来给订制二级键盘// 给文本框设置输入附加视图(二级键盘)nameField.inputAccessoryView = myView;如下图

10

=====放弃焦点键盘==========点击“重置” 按钮    所有的文本框都清零======

11

=========判断用户使用的是什么键盘===========UITextInputMode这个类是在4.2之后才有的一个新的类,是用来获取当前文本输入模式的。判断用户使用的是什么键盘的。用法很简单[[UITextInputMode currentInputMode] primaryLanguage];

12

====限制用户输入文字内容的长度====【注意】要求限制用户在密码输入框中输入12位长度以内的密码,如果超出,则不显示,也就是不能再输入了但是如果键盘模式是中文状态,那么就会出现问题,比如你输入“天气真好啊”,然后按return按键,这时候直接把对应的拼音给输入到了输入框中,超过了12个长度限制,这时候又会发现新的bug,就是超过了长度之后,也不能删除输入框中的内容解决办法:

13

======自动补全========有个需求就是 需要用户输入几位以后账号,可以根据本地存储的登录成功的账号,进行自动补全,并且补全内容为选中状态,不影响用户的新输入

14

======获取光标的位置========  //获取光标的位置  UITextRange *selectedRange = [textField selectedTextRange];根据NSRange 转换成 NSTextRange  UITextPosition *beginning = textView.beginningOfDocument;  //开始的位置 UITextPosition *start = [textView positionFromPosition:beginning offset:range.location];  //结束的位置 UITextPosition *end = [textView positionFromPosition:start offset:range.length];   UITextRange *textRange = [textView textRangeFromPosition:start toPosition:end]];   根据NSTextRange转换成 NSRange- (NSRange) selectedRange:(UITextField *)textField {            UITextPosition* beginning = textField.beginningOfDocument;            UITextRange* selectedRange = textField.selectedTextRange;           UITextPosition* selectionStart = selectedRange.start;           UITextPosition* selectionEnd = selectedRange.end;           const NSInteger location = [textField offsetFromPosition:beginning toPosition:selectionStart];           const NSInteger length = [textField offsetFromPosition:selectionStart toPosition:selectionEnd]; }

推荐信息