美文网首页
iOS输入内容-大写显示

iOS输入内容-大写显示

作者: Freedom_fly | 来源:发表于2017-05-16 15:18 被阅读1454次

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

    不定时更新~

    相关文章

      网友评论

          本文标题:iOS输入内容-大写显示

          本文链接:https://www.haomeiwen.com/subject/dsylxxtx.html