以下方法用于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;
}