前言
我们经常遇到统计字符数的问题呢,限制用户输入,但是联想词很难处理,这里就提供一种方法处理联想词,让字符的统计和输入很完美实现。
- 无高亮字符
OC
//代理<UITextViewDelegate>
//初始化UITextView
self.textView = [[UITextView alloc] initWithFrame:CGRectMake(15*UIRate, 5*UIRate, ScreenWidth - 30*UIRate, 130*UIRate)];
self.textView.placeholder = @"请您详细描述使用中遇到的问题也欢迎对我们的吐槽,感谢您提出的宝贵意见";
self.textView.placeholderColor = [UIColor fontColorLightGray];
self.textView.textColor = [UIColor fontColorBlack];
self.textView.font = FONT_SYSTEM(15);
_textView.delegate = self;
[holdView addSubview:self.textView];
//实现代理方法
//TOTAL_NUM 200
- (void)textViewDidChange:(UITextView *)textView{
if (textView.text.length > (TOTAL_NUM - 50)){
//获得已输出字数与正输入字母数
UITextRange *textRange = textView.markedTextRange;
//获取高亮部分
UITextPosition *position = [textView positionFromPosition:textRange.start offset:0];
if (position != nil){
return;
}
NSString *textContent = textView.text;
int textNum = (int)textContent.length;
//截取200个字
if (textNum > TOTAL_NUM)
{
NSRange rangeIndex = [textContent rangeOfComposedCharacterSequenceAtIndex:TOTAL_NUM];
if (rangeIndex.length == 1)//表情占用两个字符这里能更好的判断
{
textView.text = [textContent substringToIndex:TOTAL_NUM];
}
else
{
NSRange rangeRange = [textContent rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, TOTAL_NUM)];
textView.text = [textContent substringWithRange:rangeRange];
}
}
}
self.textNum = (int)textView.text.length;
self.numLabel.text = [NSString stringWithFormat:@"%d/%d",self.textNum, TOTAL_NUM];
}
- 有高亮字符
Swift
初始化等见OC版本
//MARK: - TextViewDelegate
func textViewDidChange(_ textView: UITextView) {
if textView.text.characters.count > 150 {
//获得已输出字数与正输入字母数
let selectRange = textView.markedTextRange
//获取高亮部分 - 如果有联想词则解包成功
if let selectRange = selectRange {
let position = textView.position(from: (selectRange.start), offset: 0)
if (position != nil) {
return
}
}
let textContent = textView.text
let textNum = textContent?.characters.count
//截取200个字
if textNum! > TOTAL_NUM {
let index = textContent?.index((textContent?.startIndex)!, offsetBy: TOTAL_NUM)
let str = textContent?.substring(to: index!)
textView.text = str
}
}
self.textNum = textView.text.characters.count
self.numLabel.text = "(\(self.textNum)/\(TOTAL_NUM))"
}