UITextField

作者: 无邪8 | 来源:发表于2017-12-15 15:25 被阅读39次

    一、简介

    <<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];

    }

    }

    相关文章

      网友评论

        本文标题:UITextField

        本文链接:https://www.haomeiwen.com/subject/ifurwxtx.html