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

- (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会认为是两个字。

posted @ 2016-05-06 11:53  苏睿海  阅读(212)  评论(0)    收藏  举报