UITextView 200字符限制,中文算1个字,英文算0.5个字

// 注册监听方法
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textViewChanged:) name:UITextViewTextDidChangeNotification object:self.replyTextView];

/**
 * 
  计算输入的字数 , 超出规定字数不允许输入
 *
 *  @param noti 通知
 */
- ( void )textViewChanged:( NSNotification  *)noti
{
   
  NSString  * textContent =  self . replyTextView . text ;
   
  int  existTextNum = [textContent  lengthForCString ];;
   
   
  NSString  *language = [ self . replyTextView . textInputMode  primaryLanguage ];
   
   
  if  ([language  isEqualToString : @"zh-Hans" ]) {
       
  // 中文
       
  UITextRange  * selectedRange = [ self . replyTextView  markedTextRange ];
       
  UITextPosition  * position = [ self . replyTextView  positionFromPosition :selectedRange. start  offset : 0 ];
       
       
  if  (!position) {
           
  // 没有选中字符
           
           
  if  (existTextNum >  TextViewMaxLength ) {
               
  // 大于 200 字符
                textContent = [textContent
  subStringWithByteLength : TextViewMaxLength ];
                existTextNum =
  TextViewMaxLength ;
               
  self . replyTextView . text  = textContent;
            }
else
            {
               
  // 小于 200 字符
//                existTextNum = [textContent lengthForCString];
            }
        }
else
        {
           
  // 有选中字符
//            existTextNum = [textContent lengthForCString];
        }
    }
else
    {
       
  // 英文
//        existTextNum = [textContent lengthForCString];
if  (existTextNum >  TextViewMaxLength )
{
             // 大于 200 字符
            textContent = [textContent  subStringWithByteLength : TextViewMaxLength ];
            existTextNum =  TextViewMaxLength ;
             self . replyTextView . text  = textContent;
}
    }
   
   
  self . currentCountLabel . text  = [ NSString  stringWithFormat : @"%d" , existTextNum];
}

//下面这两个个都是分类里的方法,写个NSString的分类放里面用就可以了。
//这个方法从网上找的。
/**
 * 
  计算字符串字节长度 , 中文一个字节,英文 0.5 字节
 *
 * 
  @return  字节长度
 */

- (
int )lengthForCString
{
   
  int  strlength =  0 ;
   
  char  * p = ( char  *)[ self  cStringUsingEncoding : NSUnicodeStringEncoding ];
   
  for  ( int  i =  0 ; i < [ self  lengthOfBytesUsingEncoding : NSUnicodeStringEncoding ]; i ++) {
//        NSLog(@"*p:%c",*p);
       
  if  (* p) {
            p ++;
            strlength ++;
        }
       
  else  {
            p ++;
        }
    }
   
  return  (strlength +  1 )/ 2 ;
}

//这个是自己写的。
/**
 * 
  按字节数截取字符串,中文一个字节,英文 0.5 字节,如果最后字符是半个中文,自动抛掉最后一个字符
 *
 * 
  @param  length  字节数
 *
 * 
  @return  截取后的字符串
 */

- (
NSString  *)subStringWithByteLength:( int )length
{
   
  float  bytesCount =  0 ;
   
  float  lastBytesCount =  0 ;
   
  for  ( int  i =  1 ; i <=  self . length ; i ++) {
       
       
  //        NSLog(@"byteLength:%ld", [[self substringWithRange:NSMakeRange(i - 1, 1)] lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);
       
       
  if  ([[ self  substringWithRange : NSMakeRange (i -  1 ,  1 )]  lengthOfBytesUsingEncoding : NSUTF8StringEncoding ] ==  3 ) {
            bytesCount ++;
        }
else
        {
            bytesCount +=
  0.5 ;
        }
       
       
  if  (bytesCount > length) {
           
  //            NSLog(@"byteCount:%f", lastBytesCount);
           
  return  [ self  substringWithRange : NSMakeRange ( 0 , i -  1 )];
        }
else  if  (bytesCount == length)
        {
           
  return  [ self  substringWithRange : NSMakeRange ( 0 , i)];
        }
else
        {
            lastBytesCount = bytesCount;
        }
    }
   
  return  @" 按字节截取字符串出错,请检查截取字节是否超出范围。 " ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值