iOS 6 以前使用KVC改变placeholder的字体颜色和大小字体
[textField setValue:[UIColor redColor]forKeyPath:@"_placeholderLabel.textColor"]; [textField setValue:[UIFontboldSystemFontOfSize:14]forKeyPath:@"_placeholderLabel.font"];
iOS6以后还可使用attributedPlaceholder来设置spa
UITextField *textField = [[UITextField alloc]initWithFrame:CGRectMake(0, 0, 200, 200)]; NSString *holderText = @"hello world!"; NSMutableAttributedString *placeholder = [[NSMutableAttributedString alloc]initWithString:holderText]; [placeholder addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(0, holderText.length)]; [placeholder addAttribute:NSFontAttributeName value:[UIFontboldSystemFontOfSize:14] range:NSMakeRange(0, holderText.length)]; textField.attributedPlaceholder = placeholder;
在输入用户名或者昵称的时候通常都有限制长度的需求. 通常的作法都是在代理
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string; // return NO to not change text
这个代理方法中限制,当输入超过必定的长度时,不让输入.可是这种方法有两个问题:code
1.当输入法是中文时,点击 "联想"的文字并不会走这个代理方法,因此没法限制.server
2.当输入是中文时, 因为shouldChangeCharactersInRange判断的是当前键盘的字符数, 会出现这样的问题: 好比你还剩下2个字能够打, 你想输入"张三", "张"的拼音是Zhang, 因而你在输入Zh的时候就没法输入了. (输入英文是能够的)继承
针对问题1能够配合下面两个方法解决:事件
// 监听文本改变的通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChanged:) name:UITextFieldTextDidChangeNotification object:nil];
或者字符串
// 添加target监听文字改变 [textField addTarget:self action:@selector(textChanged:) forControlEvents:UIControlEventEditingChanged];
在 textChanged:方法中截取相应长度的字符串. 可是由于问题2的存在 这种截取并不精准.get
在网上查了资料找到了一种比较靠谱的限制输入文字长度的方法经过监听文本改变的通知:string
// 监听文本改变的通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChanged:) name:UITextFieldTextDidChangeNotification object:nil];
或者是添加target事件监听问题改变:
// 添加target监听文字改变 [textField addTarget:self action:@selector(textChanged:) forControlEvents:UIControlEventEditingChanged];
而后在 textChanged:方法中设置:
- (void)textChanged:(UITextField *)textField { NSInteger maxLength = 18; NSString *toBeString = textField.text; NSString *lang = [textField.textInputMode primaryLanguage]; if ([lang isEqualToString:@"zh-Hans"])// 简体中文输入 { //获取高亮部分 UITextRange *selectedRange = [textField markedTextRange]; UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0]; // 没有高亮选择的字,则对已输入的文字进行字数统计和限制 if (!position) { if (toBeString.length > maxLength) { NSRange rangeIndex = [toBeString rangeOfComposedCharacterSequenceAtIndex:maxLength]; if (rangeIndex.length == 1) { textField.text = [toBeString substringToIndex:maxLength]; } else { NSRange rangeRange = [toBeString rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, maxLength)]; textField.text = [toBeString substringWithRange:rangeRange]; } } } } // 中文输入法之外的直接对其统计限制便可,不考虑其余语种状况 else { if (toBeString.length > maxLength) { NSRange rangeIndex = [toBeString rangeOfComposedCharacterSequenceAtIndex:maxLength]; if (rangeIndex.length == 1) { textField.text = [toBeString substringToIndex:maxLength]; } else { NSRange rangeRange = [toBeString rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, maxLength)]; textField.text = [toBeString substringWithRange:rangeRange]; } } } }
这种作法对第三方输入法(如:搜狗,百度等)也是有效的.
默认textField输入的文字以及placeholder都是从起始位置,这样看起来效果很是的很差,因此咱们在实际使用的时候每每让输入文本的位置及placeholder的位置日后挪挪.具体的作法是: 从新一个类继承自 UITextField
而后重写:
// placeholder日后挪15个点 - (CGRect)placeholderRectForBounds:(CGRect)bounds { return CGRectInset(bounds, 15, 0); } // 文本编辑的位置日后挪15个点 - (CGRect)editingRectForBounds:(CGRect)bounds { return CGRectInset(bounds, 15, 0); } // 文本位置 - (CGRect)textRectForBounds:(CGRect)bounds { return CGRectInset(bounds, 15, 0); }
这两个方法便可.
UITextField还有其余的一些方法,有兴趣的同窗能够本身尝试下.
- (CGRect)borderRectForBounds:(CGRect)bounds; - (CGRect)textRectForBounds:(CGRect)bounds; - (CGRect)clearButtonRectForBounds:(CGRect)bounds; - (CGRect)leftViewRectForBounds:(CGRect)bounds; - (CGRect)rightViewRectForBounds:(CGRect)bounds;
以上三点就是我在使用UITextField使用时经常使用到的小点,若有纰漏请指正.