textView 限制文字

  • (BOOL)textView:(UITextView)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString)text{
    if ([text isEqualToString:@"\n"]) { // 输入回车
    [textView resignFirstResponder];
    return NO;
    }
    return YES;
    }

  • (void)textViewDidChange:(UITextView*)textView{
    UITextRange *selectedRange = [textView markedTextRange];
    // 获取高亮部分 中文联想
    UITextPosition *posi = [textView positionFromPosition:selectedRange.start offset:0];

      // 如果在变化中是高亮部分在变,就不要计算字符
      if (selectedRange && posi) {
          return;
      }
      // 实际总长度
      NSInteger realLength = textView.text.length;
      NSRange selection = textView.selectedRange;
    

// NSString *headText = [textView.text substringToIndex:selection.location]; // 光标前的文本
NSString *tailText = [textView.text substringFromIndex:selection.location]; // 光标后的文本
NSInteger restLength = 500 - tailText.length; // 光标前允许输入的最大数量

    if (realLength > 500) {
        // 解决半个emoji 定位到index位置时,返回在此位置的完整字符的range
        NSRange range = [textView.text rangeOfComposedCharacterSequenceAtIndex:restLength];
        NSString *subHeadText = [textView.text substringToIndex:range.location];

// NSString *subHeadText = [headText substringToIndex:restLength];
textView.text = [subHeadText stringByAppendingString:tailText];
[textView setSelectedRange:NSMakeRange(restLength, 0)];
// 解决粘贴过多之后,撤销粘贴 崩溃问题 —— 不会出现弹框
[textView.undoManager removeAllActions];
}
// 0/500
_contLabel.text = [NSString stringWithFormat:@"%ld/%d", textView.text.length,500];

}

你可能感兴趣的:(textView 限制文字)