UITextField详解

键盘事件

使用场景:
  • 计算键盘的高度,调整UI布局
  • 根据键盘显示隐藏执行UI的动画
使用方法
  //注册事件
 [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
 
 
 //接收事件
 -(void)keyboardWillShow:(NSNotification*)notification{ 
   NSDictionary*info=[notification userInfo]; 
   CGSize kbSize=[[info objectForKey:UIKeyboardFrameEndUserInfoKey]CGRectValue].size; 
   NSLog(@"keyboard changed, keyboard width = %f, height = %f",  
          kbSize.width,kbSize.height); 
  
  
} 


// NSNotification需要remove
-(void)viewDidUnload{ 
   [superviewDidUnload]; 
   [[NSNotificationCenter defaultCenter]removeObserver:self]; 
} 
 
继承关系.png

属性(Attributes)

UITextField的text属性与userInteractionEnabled共用。

   textField.text = @"密码输入框"          
// 输入框默认输入文本,有时需求UITextField只可显示不可编辑的,
// 此时起展示作用:用此属性设置需要显示的文本
// 然后设置UITextField不可交互textField.userInteractionEnabled = NO;
  textField.userInteractionEnabled = NO;

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

边框


 textField.borderStyle = UITextBorderStyleLine;
//效果如下图所示
typedef NS_ENUM(NSInteger, UITextBorderStyle) {
    UITextBorderStyleNone,
    UITextBorderStyleLine,
    UITextBorderStyleBezel,
    UITextBorderStyleRoundedRect
};

Paste_Image.png

font属性

 textField.font = [UIFont systemFontOfSize:14.0f];
 textField.textColor = [UIColor redColor];

 根据输入文字动态调整字体大小,需要设置一个最小字体大小
 textField.adjustsFontSizeToFitWidth = YES;
 textField.minimumFontSize = 10.0;//设置最小字体

设置输入内容的对其方式

textField.textAlignment = NSTextAlignmentLeft;

        NSTextAlignmentLeft      = 0,    // Visually left aligned
#if TARGET_OS_IPHONE
        NSTextAlignmentCenter    = 1,    // Visually centered
        NSTextAlignmentRight     = 2,    // Visually right aligned
#else /* !TARGET_OS_IPHONE */
        NSTextAlignmentRight     = 1,    // Visually right aligned
        NSTextAlignmentCenter    = 2,    // Visually centered
#endif
        NSTextAlignmentJustified = 3,    // Fully-justified. The last line in a paragraph is natural-aligned.
        NSTextAlignmentNatural   = 4,    // Indicates the default alignment for script



[textField setContentVerticalAlignment:UIControlContentVerticalAlignmentCenter];
[textField setContentHorizontalAlignment:UIControlContentHorizontalAlignmentRight];


UIControlContentVerticalAlignmentCenter  = 0,
    UIControlContentVerticalAlignmentTop     = 1,
    UIControlContentVerticalAlignmentBottom  = 2,
    UIControlContentVerticalAlignmentFill    = 3,



UIControlContentHorizontalAlignmentCenter = 0,
    UIControlContentHorizontalAlignmentLeft   = 1,
    UIControlContentHorizontalAlignmentRight  = 2,
    UIControlContentHorizontalAlignmentFill   = 3,

与键盘相关的属性


    textField.keyboardType = UIKeyboardTypeNumberPad;   //设置键盘的样式
//    typedef enum {
//        UIKeyboardTypeDefault,       默认键盘,支持所有字符
//        UIKeyboardTypeASCIICapable,  支持ASCII的默认键盘
//        UIKeyboardTypeNumbersAndPunctuation,  标准电话键盘,支持+*#字符
//        UIKeyboardTypeURL,            URL键盘,支持.com按钮 只支持URL字符
//        UIKeyboardTypeNumberPad,              数字键盘
//        UIKeyboardTypePhonePad,    电话键盘
//        UIKeyboardTypeNamePhonePad,   电话键盘,也支持输入人名
//        UIKeyboardTypeEmailAddress,   用于输入电子 邮件地址的键盘
//        UIKeyboardTypeDecimalPad,     数字键盘 有数字和小数点
//        UIKeyboardTypeTwitter,        优化的键盘,方便输入@、#字符
//        UIKeyboardTypeAlphabet = UIKeyboardTypeASCIICapable,
//    } UIKeyboardType;


   textField.autocapitalizationType = UITextAutocapitalizationTypeNone;  //首字母是否自动大写
//    typedef enum {
//        UITextAutocapitalizationTypeNone, 不自动大写
//        UITextAutocapitalizationTypeWords,  单词首字母大写
//        UITextAutocapitalizationTypeSentences,  句子的首字母大写
//        UITextAutocapitalizationTypeAllCharacters, 所有字母都大写
//    } UITextAutocapitalizationType;
//
    
    
    textField.keyboardAppearance=UIKeyboardAppearanceDefault; //键盘外观
//    typedef enum {
//        UIKeyboardAppearanceDefault, 默认外观,浅灰色
//        UIKeyboardAppearanceAlert,     深灰 石墨色
//    } UIReturnKeyType;
    
    
    textField.returnKeyType =UIReturnKeyDone;   //return键变成什么键
//    typedef enum {
//        UIReturnKeyDefault, 默认 灰色按钮,标有Return
//        UIReturnKeyGo,      标有Go的蓝色按钮
//        UIReturnKeyGoogle, 标有Google的蓝色按钮,用语搜索
//        UIReturnKeyJoin, 标有Join的蓝色按钮
//        UIReturnKeyNext, 标有Next的蓝色按钮
//        UIReturnKeyRoute, 标有Route的蓝色按钮
//        UIReturnKeySearch, 标有Search的蓝色按钮
//        UIReturnKeySend, 标有Send的蓝色按钮
//        UIReturnKeyYahoo, 标有Yahoo的蓝色按钮
//        UIReturnKeyYahoo, 标有Yahoo的蓝色按钮
//        UIReturnKeyEmergencyCall, 紧急呼叫按钮
//    } UIReturnKeyType;

其他相关属性

//    以下几个属性通常不用,通常为自定义控件先设置一个UIView UIView上面再放UIImageview 和 UITextField,设置UIView的boder属性以满足要求。
  leftView
  Property
  leftViewMode
  Property
  rightView
  Property
  rightViewMode
  Property


清空输入框,常见于密码输入错入重新输入时会清空输入框。
 textField.clearButtonMode = UITextFieldViewModeWhileEditing;// sets when the clear button shows up编辑的时候清空输入框
 //clearsOnInsertion// whether inserting text replaces the previous contents.插入的时候清空输入框

    
//    typedef NS_ENUM(NSInteger, UITextFieldViewMode) {
//        UITextFieldViewModeNever,从不出现
//        UITextFieldViewModeWhileEditing,编辑时出现
//        UITextFieldViewModeUnlessEditing,除了编辑外都出现
//        UITextFieldViewModeAlways 一直出现
//    };
    
    textField.autocorrectionType = UITextAutocorrectionTypeNo;  //是否自动纠错
//    typedef enum {
//        UITextAutocorrectionTypeDefault, 默认
//        UITextAutocorrectionTypeNo,   不自动纠错
//        UITextAutocorrectionTypeYes,  自动纠错
//    } UITextAutocorrectionType;
    
secureTextEntry  启用/禁用 UITextField对象的安全输入功能。如果设置成YES则类似于密码框内容将显示为圆点。

autocorrectionType  启用/禁用 UITextFieldUI想的拼写建议功能,根据用户输入错误的单词提供修改建议

autocapitalizationType  设置 UITextField的自动大写功能,
none:关闭大写功能
words: 单词
sentences: 句子
allcharacters:所有字母
四种类型

委托

委托在开发中使用也比较广泛,例如手机号码输入框,可以通过委托的shouldChangeCharactersInRange方法控制用户能且只能输入11位数字(例子讲解)。另外,开发中通常要求输入框内容输入后才让按钮可以点击。

委托的相关方法介绍

    - (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;
    }  
    -(BOOL)textFieldShouldReturn:(UITextField *)textField{  
        
        //返回一个BOOL值,指明是否允许在按下回车键时结束编辑  
        //如果允许要调用resignFirstResponder 方法,这回导致结束编辑,而键盘会被收起[textField resignFirstResponder];
        //查一下resign这个单词的意思就明白这个方法了 
        
        return YES;  
    }

需求一:如下图

1.phoneNumber输入框最多只能输入11位数字。
2.输入框有内容后按钮变成可点击状态否则为灰色。

灰色状态
可点击状态
CNNYRegisterInputView类为自定义的输入框
在.h文件里面定义好delegate协议如下

@protocol CNNYRegisterInputViewTextFieldDelegate <NSObject>
@optional
-(void)didTextFieldUnChange;
@optional
- (void)didTextFieldChange:(UITextField *)textField andText:(NSString *)text;
@end

@interface CNNYRegisterInputView : UIView<UITextFieldDelegate>

@property(weak, nonatomic) id<CNNYRegisterInputViewTextFieldDelegate> delegate;
@property (nonatomic,strong) UITextField *textfield;
@property (nonatomic,strong) UIImageView *leftView;

- (instancetype)InitInputViewWithImage:(NSString *)placeHolder andImage:(NSString *)imageUrl;

- (void)setMode:(CNRegisterInputMode)mode;

@end

在.m文件如下

//
//  CNNYRegisterInputView.m
//  cheniu_shop
//
//  Created by brandonyum on 15/11/17.
//  Copyright © 2015年 souche. All rights reserved.
//

#import "CNNYRegisterInputView.h"
#import <Masonry.h>
#import <UIColor+CNNHexColor.h>
#import "CNNYConstant.h"

static CGFloat const kMarginLfet = 16.0;
static NSString *const kBorderColorStr = @"#D1D1D1";

@interface CNNYRegisterInputView()

//@property (nonatomic,strong) UIImageView *leftView;
@property (nonatomic,strong) UIView *splitLine;

@end

@implementation CNNYRegisterInputView

- (instancetype)InitInputViewWithImage:(NSString *)placeHolder andImage:(NSString *)imageUrl{
    if (self == [super init]) {
        [self addSubview:self.textfield];
        [self addSubview:self.leftView];
        [self addSubview:self.splitLine];
        [self Constraints];
        
        [self.textfield setPlaceholder:CNNShopLoc(placeHolder)];
        [self.textfield setContentVerticalAlignment:UIControlContentVerticalAlignmentCenter];
        [self.leftView setImage:[UIImage imageNamed:imageUrl]];
       
        [self.layer setBorderColor:[UIColor cnn_colorWithHexString:kBorderColorStr].CGColor];
        [self.layer setBorderWidth:0.5];
        self.layer.cornerRadius = 8;
        [self setBackgroundColor:[UIColor whiteColor]];
    }
    return self;

}
- (instancetype)init{
    self = [super init];
    if (self) {
        [self addSubview:self.textfield];
        [self addSubview:self.leftView];
        [self addSubview:self.splitLine];
        [self Constraints];
        
        [self.layer setBorderColor:[UIColor cnn_colorWithHexString:kBorderColorStr].CGColor];
        [self.layer setBorderWidth:0.5];
        [self setBackgroundColor:[UIColor whiteColor]];
    }
    return self;
}

- (void)Constraints{
    __weak typeof(self) weakSelf = self;
    [self.leftView mas_remakeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(weakSelf.mas_left).offset(kMarginLfet);
        make.top.bottom.equalTo(weakSelf);
        make.width.equalTo(@(18.0));
    }];
    
    [self.splitLine mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(weakSelf.leftView.mas_right).offset(8.0);
        make.top.equalTo(weakSelf).offset(12.0);
        make.bottom.equalTo(weakSelf).offset(-12.0);
        make.width.equalTo(@(0.3));
    }];
    
    [self.textfield mas_remakeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(weakSelf.splitLine.mas_right).offset(8.0);
        make.top.bottom.equalTo(weakSelf);
        make.right.equalTo(weakSelf.mas_right).offset(-kMarginLfet);
    }];
}

- (UIView *)splitLine{
    if (!_splitLine) {
        _splitLine = [[UIView alloc]init];
        [_splitLine setBackgroundColor:[UIColor colorWithRed:181/255.0f green:181/255.0f blue:182/255.0f alpha:0.4]];
    }
    return _splitLine;
}

- (UITextField *)textfield{
    if (!_textfield) {
        _textfield = [[UITextField alloc]init];
        [_textfield setFont:[UIFont systemFontOfSize:16.0]];
        [_textfield setTextColor:[UIColor cnn_colorWithHexString:@"#808080"]];
        [_textfield setClearButtonMode:UITextFieldViewModeWhileEditing];
        [_textfield setContentHorizontalAlignment:UIControlContentHorizontalAlignmentCenter];
    }
    return _textfield;
}

- (UIImageView *)leftView{
    if (!_leftView) {
        _leftView = [[UIImageView alloc]init];
        [_leftView setContentMode:UIViewContentModeCenter];
    }
    return _leftView;
}
//实现UITextField的委托协议
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
    
        NSMutableString *text = [NSMutableString stringWithString:textField.text];
        [text replaceCharactersInRange:range withString:string];
        if (text.length > 0) {
        //在输入框不为空的时候用定义好的协议发送通知,更新UI
            if ([self.delegate respondsToSelector:@selector(didTextFieldChange:andText:)]) {
                [self.delegate didTextFieldChange:textField andText:text];
            }
            
        }else{
    //在输入框delete为空的时候用定义好的协议发送通知,更新UI
            if ([self.delegate respondsToSelector:@selector(didTextFieldUnChange)]) {
                [self.delegate didTextFieldUnChange];
            }
        }
      
    //限制textField的长度不超过11位
            if (text.length > 11) {
                return NO;
            }else{
                return YES;
            }
       
    
    }

- (void)setMode:(CNRegisterInputMode)mode{
    if (mode == CNRegisterInputModePhone) {
        [_textfield setKeyboardType:UIKeyboardTypeNumberPad];
        [_textfield setSecureTextEntry:NO];
    }else{
        [_textfield setKeyboardType:UIKeyboardTypeDefault];
        [_textfield setSecureTextEntry:YES];
    }
}

@end

需求优化,

上面代码中shouldChangeCharactersInRange方法仅仅只是判断了text.length的长度,大于指定长度假设为11位,大于11后return NO

  • 思考1:用户复制粘贴怎么办。像微博那种限制140字,如果用户复制了200字到输入框中,这样限制用户输入长度就无效了。
  • 思考2:用户输入了11位后,发现前面输错了,怎么办。现在已经是return NO了,发现根本无法更改。
解决示例代码:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
    NSString *minValue = [self.field.valueRange valueForKey:min];
    NSString *maxValue = [self.field.valueRange valueForKey:max];
   //解决问题2,删除按钮,确认等按钮其长度为0,所以判断当输入长度为0的时候让按钮有效返回YES。
    if (string.length == 0) {
        return YES;
    }
    
    if (textField.tag == 2) {
        if (string.length +range.location <= maxValue.length ) {
            return YES;
        }else{
            return NO;
        }
    }else{
        if (string.length + range.location > minValue.length) {
            return NO;
        }else{
            return YES;
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容