- (NSUInteger)letterCountWithLimits:(NSInteger)limits { NSString *toBeString = self.text; NSUInteger txtCount = toBeString.length; UITextRange *selectedRange = [self markedTextRange]; //获取高亮部分 UITextPosition *position = [self positionFromPosition:selectedRange.start offset:0]; // 没有高亮选择的字,则对已输入的文字进行字数统计和限制 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会认为是两个字。
时间: 2024-11-12 17:55:55