您的位置:首页 > 移动开发 > IOS开发

iOS 在只能输入15个字符的情况下由于属于表情占两个字符,最后一个表情损坏

2016-04-15 10:45 295 查看
NSInteger length;

-(void)textFiledEditChanged:(NSNotification*)obj{

UITextField *textField = (UITextField *)obj.object;

NSString *toBeString = textField.text;

DSLog(@" ----toBeString----- %@",toBeString);

NSInteger length = [self
getStringLengthWithString:toBeString];

DSLog(@"--------字符长度-------%ld",(long)length);

NSString *lang = [[UITextInputMode
currentInputMode]
primaryLanguage]; //
键盘输入模式

if([lang
isEqualToString:@"zh-Hans"]) {
//简体中文输入,包括简体拼音,健体五笔,简体手写

UITextRange *selectedRange = [textField
markedTextRange];

//获取高亮部分

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

//没有高亮选择的字,则对已输入的文字进行字数统计和限制

if(!position) {

if(toBeString.length >
kHZMaxLength) {

textField.text = [toBeString
substringToIndex:kHZMaxLength];

DSLog(@"
中文超过字符的时候 %@",textField.text);

}

}

//有高亮选择的字符串,则暂不对文字进行统计和限制

else{

}

}

//中文输入法以外的直接对其统计限制即可,不考虑其他语种情况

else{

if(toBeString.length >
kEGMaxLength) {

textField.text= [toBeString
substringToIndex:kEGMaxLength];

DSLog(@"
其他超过字符的时候 %@",textField.text);

}

}

//获取高亮部分

UITextRange *selectedRange = [textField
markedTextRange];

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

// 没有高亮选择的字,则对已输入的文字进行字数统计和限制

if (!position)

{

if (toBeString.length >
15 && textField.markedTextRange ==
nil)

{

//用字符串的字符编码指定索引查找位置
一次遍历一个子串,
而不是遍历一个unichar了.
字符长度设置15

NSRange rangeIndex = [toBeString
rangeOfComposedCharacterSequenceAtIndex:14];

if (rangeIndex.length ==
1)

{

textField.text = [toBeString
substringToIndex:15];

DSLog(@"====== 1 ====%@",textField.text);

}

else

{

//用字符串的字符编码指定区域段查找位置

// NSRange rangeRange = [toBeString rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, Max_Length)];

textField.text = [toBeString
substringWithRange:NSMakeRange(0,
kEGMaxLength + 1)];

DSLog(@"====== 2 ====%@",textField.text);

}

} else {

length = toBeString.length;

DSLog(@"----- length ----%ld",(long)length);

}

}

}

- (NSInteger)getStringLengthWithString:(NSString *)string

{

__block
NSInteger stringLength =
0;

[string enumerateSubstringsInRange:NSMakeRange(0,
[string length])

options:NSStringEnumerationByComposedCharacterSequences

usingBlock:^(NSString *substring,
NSRange substringRange,
NSRange enclosingRange,
BOOL *stop)

{

const
unichar hs = [substring
characterAtIndex:0];

if (0xd800 <= hs && hs <=
0xdbff)

{

if (substring.length >
1)

{

const
unichar ls = [substring
characterAtIndex:1];

const
int uc = ((hs - 0xd800) *
0x400) + (ls - 0xdc00) +
0x10000;

if (0x1d000 <= uc && uc <=
0x1f77f)

{

stringLength += 1;

}

else

{

stringLength += 1;

}

}

else

{

stringLength += 1;

}

} else
if (substring.length >
1)

{

const
unichar ls = [substring
characterAtIndex:1];

if (ls ==
0x20e3)

{

stringLength += 1;

}

else

{

stringLength += 1;

}

} else {

if (0x2100 <= hs && hs <=
0x27ff)

{

stringLength += 1;

}

else
if (0x2B05 <= hs && hs <=
0x2b07)

{

stringLength += 1;

}

else
if (0x2934 <= hs && hs <=
0x2935)

{

stringLength += 1;

}

else
if (0x3297 <= hs && hs <=
0x3299)

{

stringLength += 1;

}

else
if (hs == 0xa9 || hs ==
0xae || hs == 0x303d || hs ==
0x3030 || hs == 0x2b55 || hs ==
0x2b1c || hs == 0x2b1b || hs ==
0x2b50)

{

stringLength += 1;

}

else

{

stringLength += 1;

}

}

}];

return stringLength;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: