码迷,mamicode.com
首页 > 其他好文 > 详细

关于textView的字数限制

时间:2016-05-02 11:50:28      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:

    换了一份新的工作后,由于需求,需要写一个限制字数的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;
      
}

以上是主要代码。另外,经过测试,表情符号也会自动转化为相关的数字。

 

关于textView的字数限制

标签:

原文地址:http://www.cnblogs.com/dsp-ios/p/5452074.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!