[API] UITextField

单行可编辑文本区域

创建

CGRect textFieldFrame = CGRectMake(0, [UIApplication sharedApplication].statusBarFrame.size.height, 100, 50);
UITextField *textField = [[UITextField alloc] initWithFrame:textFieldFrame];

设置外观

  • 边框样式
textField.backgroundColor = [UIColor whiteColor];

// UITextBorderStyleNone : 只有在该样式下,设置背景图才会生效,且图片大小小于 textField 的frame时,图片会拉伸。
// UITextBorderStyleLine
// UITextBorderStyleBezel
// UITextBorderStyleRoundedRect
  • 背景色
textField.backgroundColor = [UIColor whiteColor];
  • 背景图片/ enable 为 NO 时背景图片
textField.borderStyle = UITextBorderStyleNone;
textField.background = [UIImage imageNamed:@"xxx.png"];
textField.disabledBackground = [UIImage imageNamed:@"xxxx.png"];
  • 覆盖 View(left & right & clearButton)
self.textField.leftView = leftOverlayButton;(rightView 同理)
self.textField.leftViewMode = UITextFieldViewModeAlways;

// UITextFieldViewModeNever
// UITextFieldViewModeWhileEditing
// UITextFieldViewModeUnlessEditing
// UITextFieldViewModeAlways

// clearButton 占据 rightView
// 所以当 rightView 和 clearButton 都有时,需要设置不同的 viewMode 防止显示冲突
textField.clearButtonMode = UITextFieldViewModeWhileEditing;
  • 重写绘图方法
    • - textRectForBounds:
      Returns the drawing rectangle for the text field’s text.

    • - drawTextInRect:
      Draws the receiver’s text in the specified rectangle.

    • - placeholderRectForBounds:
      Returns the drawing rectangle for the text field’s placeholder text

    • - drawPlaceholderInRect:
      Draws the receiver’s placeholder text in the specified rectangle.

    • - borderRectForBounds:
      Returns the receiver’s border rectangle.

    • - editingRectForBounds:
      Returns the rectangle in which editable text can be displayed.

    • - clearButtonRectForBounds:
      Returns the drawing rectangle for the built-in clear button.

    • - leftViewRectForBounds:
      Returns the drawing rectangle of the receiver’s left overlay view.

    • - rightViewRectForBounds:
      Returns the drawing location of the receiver’s right overlay view.

设置文本

  • 文本
textField.text = @"123";
textField.attributedText = [[NSAttributedString alloc] initWithString:@"123" 
                                                           attributes:@{NSForegroundColorAttributeName : [UIColor blackColor]}];
  • 占位文字
textField.placeholder = @"placeHolder";
textField.attributedPlaceholder  = [[NSAttributedString alloc] initWithString:@"placeholder"
                                                                   attributes:@{NSForegroundColorAttributeName : [UIColor grayColor]}];

格式化输入(属性 / 富文本)

富文本方式格式化
// 原始文本特性
textField.defaultTextAttributes = @{NSForegroundColorAttributeName : [UIColor blackColor]};
// 新输入文本特性
textField.typingAttributes = @{NSForegroundColorAttributeName : [UIColor blackColor]};
属性方式格式化
  • 字体
textField.font = [UIFont systemFontOfSize:13.0];
  • 文本颜色
textField.textColor = [UIColor grayColor];
  • 文本对齐方式
textField.textAlignment = NSTextAlignmentLeft;

// NSTextAlignmentLeft
// NSTextAlignmentCenter
// NSTextAlignmentRight
// NSTextAlignmentJustified
// NSTextAlignmentNatural
  • 暗码显示
textField.secureTextEntry = NO;
  • 文本大小自适应
textFiled.adjustsFontSizeToFitWidth = YES;
//设置文本最小字体,adjustsFontSizeToFitWidth == YES 时才起作用(默认0.0)
textFiled.minimumFontSize = 10;

管理输入行为(属性)

  • editing(readonly)
    表示现在是否在编辑状态

  • clearsOnBeginEditing
    控制开始编辑时是否清空旧文本

  • clearsOnInsertion
    控制插入文本时是否清空旧文本

  • allowsEditingTextAttributes
    控制是否可以输入富文本

键盘

  • 替换输入 View
textField.inputView = nil; // 设置成为 first responder 时显示的 View
  • 显示/收起 键盘
- becomeFirstResponder
- resignFirstResponder
  • 根据键盘尺寸调整视图
    • 接收键盘显示相关的 Notification , userInfo(dictionary) 中有键盘尺寸信息,根据尺寸信息调整视图
// already become first responder and began editing
[UIKeyboardWillShowNotification]
[UIKeyboardDidShowNotification]
[UIKeyboardWillChangeFrameNotification] (keyboard was already visible)
[UIKeyboardDidChangeFrameNotification] (keyboard was already visible)

// already resign first responder already and end editing
[UIKeyboardWillHideNotification]
[UIKeyboardDidHideNotification]
  • 设置键盘类型
textField.keyboardType = UIKeyboardTypeDefault;

常用
// UIKeyboardTypeDefault : 默认键盘,支持所有字符
// UIKeyboardTypePhonePad : 电话键盘
// UIKeyboardTypeNumberPad : 数字键盘
// UIKeyboardTypeEmailAddress : 邮件地址键盘

非常用
// UIKeyboardTypeASCIICapable : 支持ASCII的默认键盘
// UIKeyboardTypeNumbersAndPunctuation : 标准电话键盘,支持+*#字符
// UIKeyboardTypeURL : URL键盘,支持.com按钮 只支持URL字符
// UIKeyboardTypeNamePhonePad : 电话键盘,也支持输入人名
// UIKeyboardTypeDecimalPad : 数字键盘 有数字和小数点(IOS 4.1后可用)
// UIKeyboardTypeTwitter : 优化键盘,方便输入@、#字符,用于twitter文本输入(IOS 5.0后可用)
// UIKeyboardTypeWebSearch  : 支持添加链接的默认键盘类型(IOS 7.0之后可用)
// UIKeyboardTypeAlphabet = UIKeyboardTypeASCIICapable : 弃用
  • 设置换行键类型
textField.returnKeyType = UIReturnKeyDefault;

常用
// UIReturnKeyDefault : 灰色按钮[Return]
// UIReturnKeyDone : 蓝色按钮[Done]
// UIReturnKeySearch : 蓝色按钮[Search]
// UIReturnKeySend : 蓝色按钮[Send]
// UIReturnKeyJoin : 蓝色按钮[Join]
// UIReturnKeyNext : 蓝色按钮[Next]
// UIReturnKeyGo : 蓝色按钮[Go]

非常用
// UIReturnKeyGoogle : 蓝色按钮[Google](用于搜索)
// UIReturnKeyRoute : 蓝色按钮[Route]
// UIReturnKeyYahoo : 蓝色按钮[Yahoo]
// UIReturnKeyEmergencyCall : 紧急呼叫按钮
// UIReturnKeyContinue : 蓝色按钮[Continue](IOS 9.0后可用)
  • 设置键盘 亮 / 暗
textField.keyboardAppearance = UIKeyboardAppearanceDefault;

// UIKeyboardAppearanceDefault : 默认
// UIKeyboardAppearanceDark : 亮(IOS 7.0后可用)
// UIKeyboardAppearanceLight  : 暗(IOS 7.0后可用)
// UIKeyboardAppearanceAlert == UIKeyboardAppearanceDark : 弃用
  • 自动大写
textField.autocapitalizationType = UITextAutocapitalizationTypeNone;

// UITextAutocapitalizationTypeNone : 关闭
// UITextAutocapitalizationTypeWords : 单词
// UITextAutocapitalizationTypeSentences : 句子
// UITextAutocapitalizationTypeAllCharacters : 所有字母
  • 自动校正输入
textField.autocorrectionType = UITextAutocorrectionTypeNo;

// UITextAutocorrectionTypeDefault
// UITextAutocorrectionTypeNo
// UITextAutocorrectionTypeYes
  • 拼写建议
textField.spellCheckingType = UITextSpellCheckingTypeDefault;

// UITextSpellCheckingTypeDefault
// UITextSpellCheckingTypeNo
// UITextSpellCheckingTypeYes
  • 启用 / 禁用 换行键
// 默认是 NO ,换行键一直可用
// 设置为 YES ,没有输入文本时换行键被禁用
textField.enablesReturnKeyAutomatically = YES;

Delegate

确认文本和管理输入过程

  • 编辑过程方法
  • 是否允许开启编辑和结束编辑方法
  • 限制输入字符数量和内容的方法
  • 响应Clear Button和Keyboard Return Button的方法
具体方法
  • 成为 first responder 前
// 是否允许开始编辑
method : - textFieldShouldBeginEditing:
  • 成为 first responder 并开始编辑
// 显示键盘
notification : 
[UIKeyboardWillShowNotification]
[UIKeyboardDidShowNotification]
[UIKeyboardWillChangeFrameNotification] (keyboard was already visible)
[UIKeyboardDidChangeFrameNotification] (keyboard was already visible)

// 开始编辑
method : - textFieldDidBeginEditing
notification : [UITextFieldTextDidBeginEditingNotification]

// 编辑中
// 是否允许改变文本
method : - textField:shouldChangeCharactersInRange:replacementString:
notification : [UITextFieldTextDidChangeNotification]
  • 脱离 first responder 前
// 是否允许结束编辑
method : - textFieldShouldEndEditing:
  • 脱离 first responder 并结束编辑
// 隐藏键盘
notification : 
[UIKeyboardWillHideNotification]
[UIKeyboardDidHideNotification]

// end editing
method : - textFieldDidEndEditing:
notification : [UITextFieldTextDidEndEditingNotification]
  • 响应按钮
method : - textFieldShouldClear:
method : - textFieldShouldReturn:

Notification

  • UITextFieldTextDidBeginEditingNotification
    开始编辑的 textField 在参数中, userInfo dictionary 无效

  • UITextFieldTextDidChangeNotification
    文本变化的 textField 在参数中

  • UITextFieldTextDidEndEditingNotification
    结束编辑的 textField 在参数中, userInfo dictionary 无效

限制只能输入特定字符

(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
// 把可用字符放入 Set,取反
//invertedSet方法是去反字符,把所有的除了NUMBERS 里的字符都找出来(包含去空格功能)
NSCharacterSet *validCharactersSet = [[NSCharacterSet characterSetWithCharactersInString:NUMBERS]invertedSet];;

// 用 Set 中字符去拆分输入字符串并用""合并
NSString *filteredString = [[string componentsSeparatedByCharactersInSet: validCharactersSet]componentsJoinedByString:@""]; 

// 验证与原字符串是否一样,一样的话通过,不一样禁止
BOOL canChange = [string isEqualToString: filteredString];

return canChange;
}

#define NUMBERS @”0123456789n” (这个代表可以输入数字和换行,请注意这个n,如果不写这个,Done按键将不会触发,如果用在SearchBar中,将会不触发Search事件)
#define kAlphaNum   @”ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789″。

限制输入文本长度

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string; 
{ 
// textField 是此时正在输入的那个输入框
// string 是输入的字符串
// range 是输入字符串范围

// 允许按回车
if ([string isEqualToString:@"n"]) 
{ 
    return YES; 
} 
// 文本长度超过20后,禁止输入
if (self.myTextField == textField) 
{ 
    NSString * toBeString = [textField.text stringByReplacingCharactersInRange:range withString:string]; // 编辑后的文本
    if ([toBeString length] > 20) { 
        textField.text = [toBeString substringToIndex:20]; 
        return NO; 
    } 
} 
return YES; 
}

你可能感兴趣的:([API] UITextField)