iOS输入内容-大写显示

2017-05-16  本文已影响1454人  Freedom_fly

开发过程中不免客户会提出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",检测不到用户开启英文键盘,所以这套代码不支持搜狗的小写转大写。

不定时更新~

上一篇下一篇

猜你喜欢

热点阅读