textField输入限制位数(中文表情)


[self.tfNickName addTarget:self action:@selector(TFChange:) forControlEvents:UIControlEventEditingChanged];

- (void)TFChange:(UITextField *)textField{
    NSString *str = textField.text;
    NSInteger j = [self isChinese:str];
    if (j == 0) {
        DLog(@"没中文");
        if (str.length > 8 * 2) {
            textField.text = [str substringToIndex:8 * 2];
        }
    }else{
        DLog(@"有中文");
        if (str.length > 8) {
            textField.text = [str substringToIndex:8];
        }
    }
}

- (NSInteger)isChinese:(NSString *)str{
    int j = 0;
    for (int i = 0; i < str.length; i++) {
        NSInteger c = [str characterAtIndex:i];
        if (c>0x4e00 && c<0x9fff) {
            j++;
        }
    }
    return j;
}

3.13更
上边会出现表情被截取,汉字高亮部分过长无法输入的bug.修改如下:

- (void)TFChange:(UITextField *)textField{
    NSString *str = textField.text;
    NSInteger j = [self isChinese:str];
    DLog(@"输入的是%@",str);
    if (j == 0) {
        DLog(@"没中文");
        if (str.length > 10 * 2) {
            NSRange rangeIndex = [str rangeOfComposedCharacterSequenceAtIndex:10 * 2];
            
            //如果是汉字,就直接截取到限制的最大字符数
            if (rangeIndex.length == 1)
            {
                textField.text = [str substringToIndex:10 * 2];
            }
            
            //如果不是汉字,那就是emoji表情了,就截取到包括完整emoji表情后的range范围的字符
            else
            {
                NSRange rangeRange = [str rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, 10 * 2)];
                textField.text = [str substringWithRange:rangeRange];
            }
           // textField.text = [str substringToIndex:10 * 2];
        }
    }else{
        DLog(@"有中文");
        UITextRange *selectedRange = [textField markedTextRange];
        UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
        DLog(@"高亮%@,%@",selectedRange,position);
        if (!position) {
            if (str.length > 10) {
                //判断第三方中文输入法的emoji表情
                NSRange rangeIndex = [str rangeOfComposedCharacterSequenceAtIndex:10];
                if (rangeIndex.length == 1)
                {
                    textField.text = [str substringToIndex:10];
                }
                else
                {
                    NSRange rangeRange = [str rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, 10)];
                    textField.text = [str substringWithRange:rangeRange];
                }
                
              /*  //中文和emoj表情存在问题,需要对此进行处理
                NSRange range;
                NSUInteger inputLength = 0;
                for(int i=0; i < str.length && inputLength <= 10; i += range.length) {
                    range = [textField.text rangeOfComposedCharacterSequenceAtIndex:i];
                    inputLength += [str substringWithRange:range].length;
                    if (inputLength > 10) {
                        NSString* newText = [str substringWithRange:NSMakeRange(0, range.location)];
                        textField.text = newText;
                    }
                }
               */
                
              //  textField.text = [str substringToIndex:10];
            }
        }
    }
}

参考文章http://www.jianshu.com/p/79d76051aecc.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,366评论 25 709
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 11,723评论 0 17
  • 13个小技巧帮你征服Xcode: http://www.cocoachina.com/ios/20150428/1...
    Stago阅读 4,436评论 0 1
  • 重 阳 感 党 恩 王道群 九九又重阳, 今年非寻...
    耕牛1949阅读 3,247评论 0 2
  • 这几天忙着实训,课程也进入期末节课备考阶段,紧张之余,翻看起《阿Q正传》. 说起鲁迅,可是20世纪中国...
    betterH阅读 3,085评论 0 0