一、简介
<<UITextField(文本框) : UITextField被用作项目中获取用户信息的重要控件.在App中UITextField是出现频率最高的控件之一.
<<继承关系:UITextField-->UIControl-->UIView-->UIResponder-->NSObject
格式为
1-->初始化(作用)
typedef NS_ENUM(NSInteger, UITextBorderStyle) {
UITextBorderStyleNone,
UITextBorderStyleLine,
UITextBorderStyleBezel,
UITextBorderStyleRoundedRect
};(如果属性有枚举类型的话,这里会有枚举类型说明)
UITextField*textField = [[UITextFieldalloc]initWithFrame:CGRectMake(10,10,300,30)]; (这是具体的例子)
@property(nullable, nonatomic,copy) NSString *placeholder; // UITextField 设置提示文字 (这是说明)
二、UITextField的文本属性(属性的顺序与苹果API一致)
1-->设置文字
textField.text = @"我是文本框";//设置文字
@property(nullable, nonatomic,copy) NSString *text;//设置显示文字, 默认是空的
2-->设置富文本
NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:label.text];-->先把UITextField上的文字赋值给可变字符串
[str addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(5,10)];-->设置更改后的颜色和改变文字的区域
[str addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Courier-BoldOblique" size:30.0] range:NSMakeRange(20, 25)];-->设置更改后的字体大小和改变文字的区域
textField.attributedText = str;-->把改后的字符串重新赋值给UITextField
@property(nullable, nonatomic,copy) NSAttributedString *attributedText; //更改任意文字的颜色和字体大小
3-->设置文字颜色
textField.textColor = [UIColor redColor];//设置文字颜色
@property(nullable, nonatomic,strong) UIColor *textColor;// 默认是不透明的黑色
4-->设置字号//一般方法
textField.font = [UIFont systemFontOfSize:30];
@property(null_resettable, nonatomic,strong) UIFont *font;// 设置字体(系统字体默认12号字体)
5-->文字字体加粗//系统加粗方法
[textField setFont:[UIFont boldSystemFontOfSize:25]];
6-->自定义文字字体和字号
textField.font = [UIFont fontWithName:@"Zapfino"size:30];
7-->自定义文字字体加粗和字号
[textFieldl setFont:[UIFont fontWithName:@"Helvetica-Bold"size:25]];
8-->文字对齐方式
typedef NS_ENUM(NSInteger, NSTextAlignment) {
NSTextAlignmentLeft = 0, // 居左对齐
#if TARGET_OS_IPHONE
NSTextAlignmentCenter = 1, //居中对齐
NSTextAlignmentRight = 2, // 居右对齐
#else /* !TARGET_OS_IPHONE */
NSTextAlignmentRight = 1, //居右对齐
NSTextAlignmentCenter = 2, //居中对齐
#endif
NSTextAlignmentJustified = 3, //合理铺满 等同于居左
NSTextAlignmentNatural = 4, //默认 等同于居左
}
textField.textAlignment = NSTextAlignmentCenter;
@property(nonatomic) NSTextAlignment textAlignment;// 对齐方式,默认是NSTextAlignmentNatural (iOS 9之前, 默认是 NSTextAlignmentLeft)
默认都是竖直居中的
UITextField不能设置竖直方向的排列布局,但是可以通过sizeToFit改变UITextField的frame来实现曲线救国。
9-->设置边框样式,只有设置了才会显示边框样式
typedef NS_ENUM(NSInteger, UITextBorderStyle) {
UITextBorderStyleNone,//无边框
UITextBorderStyleLine,//线性矩形
UITextBorderStyleBezel,//尖角矩形
UITextBorderStyleRoundedRect//圆角矩形
};
textField.borderStyle= UITextBorderStyleNone;
@property(nonatomic) UITextBorderStyle borderStyle; //默认是UITextBorderStyleNone。如果设置为UITextBorderStyleRoundedRect、自定义背景图片将被忽略。
10-->设置默认字体属性
[textField setDefaultTextAttributes: @{NSFontAttributeName: [UIFont fontWithName:@"HelveticaNeue-Light" size:20.0], NSForegroundColorAttributeName: [UIColor redColor]} ];//设置默认字体与文本颜色
@property(nonatomic,copy) NSDictionary*defaultTextAttributes;//将属性应用于文本的全部范围。未设置的属性表现为默认值。
11-->设置缺省时显示的灰度字符串
textField.placeholder = @"password";//当输入框没有内容时,水印提示提示内容为password
@property(nullable, nonatomic,copy) NSString *placeholder; //默认是70%的灰色
12-->通过AttributedString设置缺省字符串
NSMutableAttributedString *verifyStr = [[NSMutableAttributedString alloc]initWithString:@"请输入验证码" attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:14],NSForegroundColorAttributeName: [UIColor colorWithRed:181/255.0 green:181/255.0 blue:181/255.0 alpha:1.0]}];
[_VerifyTF setAttributedPlaceholder:verifyStr];//设置缺省字符串文本、字号和颜色等属性
@property(nullable, nonatomic,copy) NSAttributedString *attributedPlaceholder;
13-->设置再次编辑就清空
text.clearsOnBeginEditing = YES;//开启再次编辑就清空
@property(nonatomic) BOOL clearsOnBeginEditing; //设置UITextField是否拥有一键清除的功能,默认为NO
14-->设置UITextField自适应文本框大小
textField.adjustsFontSizeToFitWidth = YES;//设置文字自适应宽度
@property(nonatomic) BOOL adjustsFontSizeToFitWidth;
//设置调整文字大小以适配宽度(即输入不下时缩小文字,实在缩小不了了,就向下滚动),默认是向右滚动的
15-->设置自动缩小显示的最小字体大小
textField.minimumFontSize = 20;//设置最小字体大小
@property(nonatomic) CGFloat minimumFontSize; //.默认是0.0。设置最小字号,在adjustsFontSizeToFitWidth = YES,才有效,即小于这个字号的时候,我就不缩小了,直接向右滚动
15-->设置UITextFieldDelegate代理
textField.delegate = self;//设置UITextField Delegate代理
@property(nullable, nonatomic,weak) id <UITextFieldDelegate>delegate; //弱引用
三、设置UITextField的背景属性
1-->设置背景图片
textField.background= [UIImageimageNamed:@"1.png"];
@property(nullable, nonatomic,strong) UIImage *background; //绘制边框,图像应可伸缩
2-->设置禁用时的背景图片
textField.disabledBackground = [UIImage imageNamed:@"cc.png"];//设置enable为no时,textfield的背景
@property(nullable, nonatomic,strong) UIImage *disabledBackground;(默认 nil,忽略背景不设置。图片可能会被拉伸.)当UITextField被禁用时,显示文本的背景图片。
四、UITextField的编辑属性
1-->读取是否正在编辑(只读属性)
BOOL editing=text.editing ;
@property(nonatomic,readonly,getter=isEditing) BOOL editing;
2-->是否允许更改字符属性字典
textField.allowsEditingTextAttributes=YES;
@property(nonatomic) BOOL allowsEditingTextAttributes; //
默认是NO。允许用样式操作编辑文本属性并粘贴富文本
3-->设置属性字典
NSMutableDictionary * attributesDic = [textView.typingAttributes mutableCopy];
[attributesDic setObject:[UIColor redColor] forKey:NSForegroundColorAttributeName];
// automatically resets when the selection changes
// 重新设置 接下来改变的文字 的属性字典
textField.typingAttributes = attributesDic;
@property(nullable, nonatomic,copy) NSDictionary*typingAttributes NS_AVAILABLE_IOS(6_0); //.(当选中文本时,自动复位)适用于用户输入的新文本的属性。字典包含适用于新类型文本的属性键(和对应的值)。当文本字段的选择更改时,自动清除字典的内容。如果文本字段不是编辑模式,此属性包含值为零。类似地,除非文本字段当前处于编辑模式,否则不能将此属性赋值给该属性
4-->设置是否显示清除按钮
typedef NS_ENUM(NSInteger, UITextFieldViewMode) {
UITextFieldViewModeNever,//从不显示
UITextFieldViewModeWhileEditing,//编辑时显示
UITextFieldViewModeUnlessEditing,//非编辑时显示
UITextFieldViewModeAlways//一直显示
};
myTextField.clearButtonMode = UITextFieldViewModeAlways;//一直显示清除按钮
@property(nonatomic) UITextFieldViewMode clearButtonMode; //当清除按钮出现时设置。默认是UITextFieldViewModeNever
五、UITextField的View属性
1-->设置输入框左边的view
UIView *view1=[[UIView alloc]init];
//x和y无效,x都是0,而y是根据高度来自动调整的。即高度如果超过textField则默认是textField高,如小于textField高度,则上下居中显示。唯一有效的就是宽度
view1.frame=CGRectMake(10, 500, 50, 10);
view1.backgroundColor=[UIColor orangeColor];
textFiled1.leftView=view1;
@property(nullable, nonatomic,strong) UIView *leftView; // 左侧 view 视图,例如搜索栏当中的放大镜。要配合 leftViewMode 使用。
2-->设置输入框左视图的显示模式
typedef NS_ENUM(NSInteger, UITextFieldViewMode) {
UITextFieldViewModeNever,//从不显示
UITextFieldViewModeWhileEditing,//编辑时显示
UITextFieldViewModeUnlessEditing,//非编辑时显示
UITextFieldViewModeAlways//一直显示
};
textFiled.leftViewMode=UITextFieldViewModeAlways;
@property(nonatomic) UITextFieldViewMode leftViewMode; //当左边视图出现时设置。默认是UITextFieldViewModeNever
3-->设置输入框右边的view
UIView *view1=[[UIView alloc]init];
//x和y无效,x都是0,而y是根据高度来自动调整的。即高度如果超过textField则默认是textField高,如小于textField高度,则上下居中显示。唯一有效的就是宽度
view1.frame=CGRectMake(10, 500, 50, 10);
view1.backgroundColor=[UIColor orangeColor];
textFiled1.rightView=view1;
@property(nullable, nonatomic,strong) UIView *rightView; // 右侧 view 视图,例如书签按钮。要配合 rightViewMode 使用。
4-->设置输入框右视图的显示模式
typedef NS_ENUM(NSInteger, UITextFieldViewMode) {
UITextFieldViewModeNever,//从不显示
UITextFieldViewModeWhileEditing,//编辑时显示
UITextFieldViewModeUnlessEditing,//非编辑时显示
UITextFieldViewModeAlways//一直显示
};
textFiled.rightViewMode=UITextFieldViewModeAlways;
@property(nonatomic) UITextFieldViewMode rightViewMode; //当右边视图出现时设置。默认是UITextFieldViewModeNever
六、UITextField的界面重写绘制
1-->重写重置边缘区域
-(CGRect)borderRectForBounds:(CGRect)bounds{
return CGRectInset(bounds,10,0);
}
- (CGRect)borderRectForBounds:(CGRect)bounds;
2-->重写重置文字区域
-(CGRect)textRectForBounds:(CGRect)bounds{
returnCGRectInset(bounds,10,0);
}
- (CGRect)textRectForBounds:(CGRect)bounds;
3-->重写重置占位符区域
-(CGRect)placeholderRectForBounds:(CGRect)bounds{
returnCGRectInset(bounds,10,0);
}
- (CGRect)placeholderRectForBounds:(CGRect)bounds;
4-->重写重置编辑区域
-(CGRect)editingRectForBounds:(CGRect)bounds{
returnCGRectInset(bounds,10,0);
}
- (CGRect)editingRectForBounds:(CGRect)bounds;
5-->重写来重置clearButton位置,改变size可能导致button的图片失真
-(CGRect)clearButtonRectForBounds:(CGRect)bounds{
returnCGRectInset(bounds,10,0);
}
- (CGRect)clearButtonRectForBounds:(CGRect)bounds;
6-->重写输入框左视图区域
-(CGRect)leftViewRectForBounds:(CGRect)bounds{
returnCGRectInset(bounds,10,0);
}
- (CGRect)leftViewRectForBounds:(CGRect)bounds;
7-->重写输入框右视图区域
-(CGRect)rightViewRectForBounds:(CGRect)bounds{
returnCGRectInset(bounds,10,0);
}
- (CGRect)rightViewRectForBounds:(CGRect)bounds;
8-->重载drawTextInRect方法
-(void) drawTextInRect:(CGRect)rect {
return[super drawTextInRect:UIEdgeInsetsInsetRect(rect,self.neiinsets)];
}
-(void) drawTextInRect:(CGRect)rect;
9-->重载drawPlaceholderInRect方法
-(void) drawPlaceholderInRect:(CGRect)rect {
return[super drawPlaceholderInRect:UIEdgeInsetsInsetRect(rect,self.neiinsets)];
}
-(void) drawPlaceholderInRect:(CGRect)rect;
七、UITextField的键盘属性
1-->当文本字段成为第一响应者时,自定义输入视图显示。
UIImageView *imgView1=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"logo-60@3x.png"]];
imgView1.frame=CGRectMake(60, 60, 300, 300);
textFiled.inputView=imgView1;
@property (nullable, readwrite, strong) UIView *inputView;//只有height值会对视图有影响,只会改变附加视图的高度,弹出添加的这个视图,一般用作像银行app的自定义键盘
2-->当文本字段成为第一响应者时,该自定义辅助视图显示。
UIView * view = [[UIView alloc] initWithFrame:CGRectMake(100, 50, 100, 50)];
view.backgroundColor = [UIColor redColor];
// 在键盘上附加一个视图,一般用于添加一个收回键盘的按钮
textFiled.inputAccessoryView = view;
@property (nullable, readwrite, strong) UIView *inputAccessoryView;// 在键盘上附加一个视图,一般用于添加一个收回键盘的按钮
3-->注销第一响应(収键盘)
[self.view endEditing:YES];
- (BOOL)endEditing:(BOOL)force;//注销当前view(或它下属嵌入的text fields)的first responder 状态。
八、UITextField的UITextFieldDelegate代理方法
可选方法
1-->点击输入框时触发的方法,返回YES则可以进入编辑状态,NO则不能。
#pragma mark - UITextField代理方法
/** 将要开始编辑
@param textField UITextField对象
@return YES:允许编辑; NO:禁止编辑
*/
- (BOOL)textFieldShouldBeginEditing:(UITextField*)textField{
//返回一个BOOL值,指定是否循序文本字段开始编辑
return YES;
}
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField; //.当文本将要开始编辑时调用这个代理方法,返回 NO 时驳回编辑状态。
2-->开始编辑时调用的方法
/**
开始编辑,即成为第一响应者,此时光标出现
@param textField UITextField对象
*/
- (void)textFieldDidBeginEditing:(UITextField*)textField{
//开始编辑时触发,文本字段将成为first responder
}
- (void)textFieldDidBeginEditing:(UITextField *)textField; //当文本正在开始编辑时调用,变为第一响应者
3-->将要结束编辑时调用的方法,返回YES则可以结束编辑状态,NO则不能
/**
将要结束编辑
应用场景:如果当前TextField有内容,则返回YES,允许收键盘或更换TextField;
当前TextField没有输入内容,返回NO,此时不能收起键盘或者更换TextField
@param textField UITextField对象
@returnYES:允许释放键盘(注销第一响应者); NO:不允许释放键盘(始终是第一响应者)
*/
- (BOOL)textFieldShouldEndEditing:(UITextField*)textField{
//返回BOOL值,指定是否允许文本字段结束编辑,当编辑结束,文本字段会让出first responder
//要想在用户结束编辑时阻止文本字段消失,可以返回NO
//这对一些文本字段必须始终保持活跃状态的程序很有用,比如即时消息
return NO;
}
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField; //当文本将要结束编辑时进行调用,返回 YES 时允许编辑停止或者注销第一响应者,返回 NO,不允许编辑会话结束。
4-->结束编辑调用的方法
/**
已经结束编辑
(即使shouldEndEditing方法返回NO或者调用了endEditing:YES,该方法仍可能调用)
官方注释:may be called if forced even if shouldEndEditing returns NO (e.g. view removed from window) or endEditing:YES called
@param textField UITextField对象
*/
- (void)textFieldDidEndEditing:(UITextField*)textField{
//结束编辑时触发
}
- (void)textFieldDidEndEditing:(UITextField *)textField;
//上面返回YES后执行;上面返回NO时有可能强制执行(e.g.view removed from window)
5-->结束编辑调用的方法(iOS 10.0开始引入)
/**
已经结束编辑(iOS 10.0开始引入)
如果实现,将取代textFieldDidEndEditing:方法
@param textField UITextField对象
@param reason 结束原因(正常代理结束或者被迫取消)
*/
- (void)textFieldDidEndEditing:(UITextField *)textField reason:(UITextFieldDidEndEditingReason)reason {
//结束编辑时触发(iOS 10.0开始引入)
}
- (void)textFieldDidEndEditing:(UITextField *)textField reason:(UITextFieldDidEndEditingReason)reason NS_AVAILABLE_IOS(10_0) ;//如果实现,将取代textFieldDidEndEditing:方法
6-->将要改变文字内容时调用的方法
/**
将要改变文字内容时
应用场景:
1.撤销上一次输入
2.跟踪本TextField所做的最后一次修改
3.防止文字被改变
4.限制输入字符类型
@param textField UITextField对象
@param range 被修改内容的范围
@param string 修改内容取代者
@return YES:允许修改; NO:不允许修改
*/
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
returnYES;
}
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string; //询问代理文本是否可以被替换,如果返回 NO,不被替换,YES 可被替换。
7-->当按下清除按钮时调用的方法
/**
当按下清除按钮时
@param textField UITextField对象
@return YES:允许清除; NO:不许清除
*/
- (BOOL)textFieldShouldClear:(UITextField *)textField {
return YES;
}
- (void)textFieldShouldClear:(UITextField *)textField;
8-->按下键盘返回键调用的方法
/**
按下键盘返回键时
应用举例:调用resignFirstResponder方法收回键盘
@param textField UITextField对象
@return 我发现返回YES或NO,效果都一样...
*/
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
return [textField resignFirstResponder];
}
- (void)textFieldShouldReturn:(UITextField *)textField;
九、UITextField的通知
UITextField派生自UIControl,所以UIControl类中的通知系统在文本字段中也可以使用。除了UIControl类的标准事件,你还可以使用下列UITextField类特有的事件
UITextFieldTextDidBeginEditingNotification
UITextFieldTextDidChangeNotification
UITextFieldTextDidEndEditingNotification
当文本字段退出编辑模式时触发。通知的object属性存储了最终文本。
因为文本字段要使用键盘输入文字,所以下面这些事件发生时,也会发送动作通知
UIKeyboardWillShowNotification //键盘显示之前发送
UIKeyboardDidShowNotification //键盘显示之后发送
UIKeyboardWillHideNotification //键盘隐藏之前发送
UIKeyboardDidHideNotification //键盘隐藏之后发送
十、UITextField的UITextFieldDelegate代理方法拓展
1-->限制输入字符类型
在代理方法中作判断,符合返回YES,不符合返回NO。
例如匹配输入为纯数字:
/**
将要改变文字内容时
应用场景:
1.撤销上一次输入
2.跟踪本TextField所做的最后一次修改
3.防止文字被改变
4.限制输入字符类型
@param textField UITextField对象
@param range 被修改内容的范围
@param string 修改内容取代者
@returnYES:允许修改; NO:不允许修改
*/
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
// 匹配纯数字NSString *regex = @"[0-9]";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
return[pred evaluateWithObject:string];// 匹配返回YES,否则返回NO
}
2-->限制输入字符个数
字符个数决定了字符串的长度。
在代理方法中很难实时地获得字符串长度,因此不好在代理方法里判断。好在苹果提供了监听UITextField的编辑发生改变的事件,可在该事件中作判断。
首先要添加事件:
[textField addTarget:selfaction:@selector(textFieldDidChange:)forControlEvents:UIControlEventEditingChanged];
// 当编辑发生改变
- (void)textFieldDidChange:(UITextField*)textField{
// 获取字符串长度
NSUInteger strLength =0;
for (NSUInteger I=0; I<textField.text.length; i++) {
unichar uc = [textField.textcharacterAtIndex: I];
strLength += isascii(uc) ?1:2;// 汉字两个字节
}
// 如果字符串大于5,裁掉后尾
if(strLength >5) {
textField.text= [textField.text substringToIndex:5];
}
}