iOS--textField 区分中英文的字符长度限制。

一、背景

在做多语言的时候,中英文限制的字符长度不一样,此时需要根据字符长度来进行限制。下面以10个字符限制为例。

  1. 首页对textField添加一个事件监听。
    [_textField addTarget:self action:@selector(textFieldDidChanged:) forControlEvents:UIControlEventEditingChanged];
    也可以用通知对其进行监听
 [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(textFiledEditChanged:) name:UITextFieldTextDidChangeNotification object:nil];
  1. 监听事件中对逻辑进行判断

- (void)textFieldDidChanged:(UITextField *)textField{

if (textField == self.textField) {

         NSString *contentText = textField.text;

        UITextRange    *selectedRange = [textField markedTextRange];

        UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];

if (!position) {

        /****这里是计算字符的长度,是重点计算****/

         CGFloat ascLen=[self getTextWidth:textField.text];//没高亮,获取长度

if (ascLen > 10) {

         NSString *stringNew = [NSString stringWithString:contentText];

if (self.subLength == 0) {

         self.subLength = stringNew.length; 

}

           [textField setText:[stringNew substringToIndex:self.subLength]];

}

}else{

  }

  }

}
  1. 计算字符长度
- (CGFloat)getTextWidth:(NSString *)text{

// 中文字符算一个长度, 字母符号算0.5个长度

NSInteger i; CGFloat n = text.length, chineseLength = 0, a = 0, b = 0;

CGFloat wLen = 0;

unichar c;

for (i = 0; i< n; i++) {

c = [text characterAtIndex:i]; //按顺序取出单个字符

if (isblank(c)) { //判断字符串为空或为空格

b++;

}else if (isascii(c)){ // 能编码的字符长度, 也就是字母的长度

a++;

}else{

chineseLength++;

}

wLen = chineseLength+(CGFloat)(a+b)/2.0;

if (wLen >=9.5 && wLen < 10.5) {

// 当前事例以长度中文长度限制10, 字母20为例。记录达到10个时的当前长度

_subLength = chineseLength+a+b;

}

}

if (a==0 && chineseLength==0) {

_subLength = 0;

return 0;

}else{

return wLen;

}

}

你可能感兴趣的:(iOS--textField 区分中英文的字符长度限制。)