美文网首页iOS-UI基础知识
关于textView限制输入字数 避免截断Emoji

关于textView限制输入字数 避免截断Emoji

作者: Lifeasy | 来源:发表于2016-05-26 14:53 被阅读1064次

以下方法用于textView的输入字符限制,超过限制字符后不让输入,复制粘贴后,超过限制字符自动截断

  • 每一个中文或者英文在NSString中的length均为1,但是一个Emoji的length的长度为2或者4,如果使用substringToIndex可能存在把Emoji截断而导致乱码的情况
  • 所以使用rangeOfComposedCharacterSequenceAtIndex或者rangeOfComposedCharacterSequencesForRange方法,避免截断完整字符
 - (NSRange)rangeOfComposedCharacterSequenceAtIndex:(NSUInteger)index{
  //此方法用于当定位于字符串的index位置时,返回在此位置的字符完整的range
}

- (NSRange)rangeOfComposedCharacterSequencesForRange:(NSRange)range{
//此方法用于在字符串的一个range范围内,返回此range范围内完整的字符串的range
}
  • 在textView的delegate方法中,实现字符限制并截断
- (void)textViewDidChange:(UITextView *)textView{
    NSInteger value=textView.text.length;
    //高亮不进入统计 避免未输入的中文在拼音状态被统计入总长度限制
    value -= [textView textInRange:[textView markedTextRange]].length;
    if (value<=kContentLimit) {
        NSLog(@"%@",[NSString stringWithFormat:@"%d/%d",(int)value,kContentLimit]);
    } else {
        //截断长度限制以后的字符 避免截断字符
        NSString *tempStr = [textView.text substringWithRange:[textView.text rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, kContentLimit)]];
        textView.text=tempStr;
        
        NSLog(@"%@",[NSString stringWithFormat:@"最多只能输入%d字",kContentLimit]);
        NSLog(@"%@",[NSString stringWithFormat:@"%d/%d",kContentLimit,kContentLimit]);
    }
}

  • 另一个方法用于英文字符和中文字符算不同的字数
-(NSUInteger) unicodeLengthOfString: (NSString *) text {
    NSUInteger asciiLength = 0;
    for (NSUInteger i = 0; i < text.length; i++) {
        unichar uc = [text characterAtIndex: i];
        asciiLength += isascii(uc) ? 1 : 2;
    }
    NSUInteger unicodeLength = asciiLength / 2;
    if(asciiLength % 2) {
        unicodeLength++;
    }
    return unicodeLength;
}

相关文章

网友评论

  • ChefZhang:rangeOfComposedCharacterSequencesForRange讲的很明白

本文标题:关于textView限制输入字数 避免截断Emoji

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