换了一份新的工作后,由于需求,需要写一个限制字数的textView(只能输入50字符)。通过百度、谷歌,都是在下面这个方法进行限制(具体方法可直接浏览器搜索)。
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text;
但是经过测试,出现了一个问题,见下图:
图中红色框的内的文字,直接点击的时候,不会走之前的方法,因此,虽然50字符已满,但是还是可以输入。因此自己写了一个方法,可以避免这个问题的发生。
在textView的分类中有下面的方法,规定了字符计算的规范(根据公司需求自己写的,非标准)
UITextView+ cate.h 文件中
-(BOOL)limitTVWithLength:(NSInteger)lenght;
UITextView+ cate.m 文件中
-(BOOL)limitTVWithLength:(NSInteger)lenght{
UITextRange *selectedRange = [self markedTextRange];
//获取高亮部分
UITextPosition *pos = [self positionFromPosition:selectedRange.start offset:0];
//如果在变化中是高亮部分在变,就不要计算字符了
if (selectedRange && pos) {
return YES;
}
NSInteger totalLenght = 0;
NSInteger curIndex = -10;
for (NSInteger i=0; i<self.text.length; i++) {
NSString* subStr= [self.text substringWithRange:NSMakeRange(i, 1)];
NSInteger changedLenhgt = subStr.btEngLishLength;
if ((totalLenght == lenght*2-1) && (changedLenhgt == 2)) {
curIndex = i;
}
totalLenght += subStr.btEngLishLength;
if (totalLenght == lenght*2) {
curIndex = i+1;
} else if (totalLenght > lenght*2) {
curIndex = i;
}
if (curIndex != -10) {
break;
}
}
if (curIndex != -10) {
NSRange range = {0,curIndex};
self.text = [self.text substringWithRange:range];
}
return NO;
}
在textView的代理方法中进行限制
- (void)textViewDidChange:(UITextView *)textView{
//设置全局字符数
self.textLength = textView.text.length;
//显示字符数字
NSString *str = [NSString string];
//限制输入字数为50
if (textView.text.length > 50) {
str = [NSString stringWithFormat:@"%d/%d",50,50];
if ([textView limitTVWithLength:50]==NO) {
self.textLength = 50;
NSString *str2 = [textView.text substringWithRange:NSMakeRange(0, 50)];
self.textView.text = str2;
}
}else{
str = [NSString stringWithFormat:@"%ld/%d",self.textLength,50];
}
//设置一些属性
NSMutableAttributedString *attStr = [[NSMutableAttributedString alloc]initWithString:str];
[attStr addAttribute:NSForegroundColorAttributeName value:[UIColor colorWithRed:0.031 green:0.651 blue:0.941 alpha:1.000] range:NSMakeRange(0, str.length - 4)];
//赋值回去
self.label.attributedText = attStr;
}
以上是主要代码。另外,经过测试,表情符号也会自动转化为相关的数字。