一、背景
在做多语言的时候,中英文限制的字符长度不一样,此时需要根据字符长度来进行限制。下面以10个字符限制为例。
- 首页对textField添加一个事件监听。
[_textField addTarget:self action:@selector(textFieldDidChanged:) forControlEvents:UIControlEventEditingChanged];
也可以用通知对其进行监听
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(textFiledEditChanged:) name:UITextFieldTextDidChangeNotification object:nil];
- 监听事件中对逻辑进行判断
- (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{
}
}
}
- 计算字符长度
- (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;
}
}