分享一个字数限制和统计的UITextView分类方法

时间:2021-12-11 00:32:23
- (NSUInteger)letterCountWithLimits:(NSInteger)limits {
NSString *toBeString = self.text;
NSUInteger txtCount = toBeString.length; UITextRange *selectedRange = [self markedTextRange];
//获取高亮部分
UITextPosition *position = [self positionFromPosition:selectedRange.start offset:]; // 没有高亮选择的字,则对已输入的文字进行字数统计和限制
if (!position) {
if (toBeString.length > limits) { self.text = [toBeString substringToIndex:limits];
}
} // 有高亮选择的字符串,去掉高亮的字数
else{
NSInteger startOffset = [self offsetFromPosition:self.beginningOfDocument toPosition:selectedRange.start];
NSInteger endOffset = [self offsetFromPosition:self.beginningOfDocument toPosition:selectedRange.end];
NSRange offsetRange = NSMakeRange(startOffset, endOffset - startOffset); // 去掉高亮的字数
txtCount -= offsetRange.length;
} // 超出部分警告和限制
if (txtCount > limits) {
self.text = [toBeString substringToIndex:limits];
return limits;
}
return txtCount;
}

- (void)textViewDidChange:(UITextView *)textView 中调用该方法即可,返回值是当前字数。

markedTextRange, 去掉高亮的字数,对于中文是需要做这样的处理的。

不足的地方在于对\n只看成一个字,以及许多emoji会认为是两个字。