开发过程中不免客户会提出textfield输入要大写显示的需求,例如车牌号之类的,遇到这种问题我们第一时间想到肯定是在textfield编辑过程中对textfield的文字进行操作。
textfield代理方法中有一个shouldChangeCharactersInRange方法,可以监测到每次输入的内容,监测到之后就可以判断是否是小写,并对其进行大写操作,代码如下:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if (range.length == 1 && string.length == 0) {
return YES;
}
char lowercaseChar = [string characterAtIndex:0];
if (lowercaseChar > 96 && lowercaseChar < 123) {
NSString * uppercaseString = string.uppercaseString;
NSString * frontStr = [textField.text substringToIndex:range.location];
NSString * backStr = [textField.text substringFromIndex:range.location];
textField.text = [NSString stringWithFormat:@"%@%@%@",frontStr,uppercaseString,backStr];
return NO;
}
return YES;
}
后来发现了BUG:
使用上述方法之后,产生的问题:
1、苹果原生键盘无法输入汉字,只能输入字母和数字(小写字母可以转换成大写)
2、三方输入法可以正常使用(可以输入汉字,小写可以转换成大写)
之后又研究一段时间找到了新的方法:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if ( string.length == 0) {
return YES;
}
UITextInputMode *input = [UIApplication sharedApplication].delegate.window.textInputMode;
NSLog(@"%@",input.primaryLanguage);
if ([input.primaryLanguage isEqualToString:@"zh-Hans"]) {
// 简体中文输入,包括简体拼音,健体五笔,简体手写
UITextRange *selectedRange = [textField markedTextRange];
//获取高亮部分
UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
// 没有高亮选择的字,则对已输入的文字进行字数统计、限制等处理
if (!position) {
// if(textField == self.carNum && self.carNum.text.length > 0){
// // > 0可以输入一位汉字
// return NO;
// }
}
}else{
// 中文输入法以外的直接对其统计限制即可,不考虑其他语种情况
// if(textField == self.carNum && textField.text.length > 7){
// return NO;
// }
//小写变成大写
char lowercaseChar = [string characterAtIndex:0];
if (lowercaseChar > 96 && lowercaseChar < 123) {
NSString * uppercaseString = string.uppercaseString;
NSString * frontStr = [textField.text substringToIndex:range.location];
NSString * backStr = [textField.text substringFromIndex:range.location];
textField.text = [NSString stringWithFormat:@"%@%@%@",frontStr,uppercaseString,backStr];
return NO;
}
}
return YES;
}
经测试,这这个可以解决苹果原生键盘的bug,修改之后,原生键盘允许输入汉字、字母、数字,字母可转大写,但是三方输入法(搜狗输入法为例)获取到的primaryLanguage一直都是"zh-Hans",检测不到用户开启英文键盘,所以这套代码不支持搜狗的小写转大写。
不定时更新~