UITextView输入中文时避免拼音高亮站位及输入法表情屏蔽
2018-06-06 本文已影响21人
哔哩哔哩哔哩咚
我们在开发过程中,可能会遇到一些需要控制输入长度的需求,比如取名标题之类的;
一些情况下,我们限制的字符数叫短,然而用户使用拼音输入时,还未完成汉字拼写,而拼音已经高亮展示再textView上,这时候,每个拼音是占位的,有时会阻止我们完成输入,从而达不到最高输入汉字的数量。
对了,还有一种情况需求需要我们屏蔽掉表情,包括输入法,输入拼音时所展示的表情图案,比如:🌺、😄
输入法花@2x.png 输入法笑@2x.png
这个我们无法通过屏蔽emoji来屏蔽。
接下来这段代码,可以解决这些小问题
//输出长度小于20,并且屏蔽表情
-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{
NSString *toBeString = textView.text;
if ([text isEqualToString:@"\n"]) return NO;
NSString *lang = [[textView textInputMode] primaryLanguage]; // 键盘输入模式
if (lang == nil && text.length > 0) return NO;//键盘表情
if ([lang isEqualToString:@"zh-Hans"]) { // 简体中文输入,包括简体拼音,健体五笔,简体手写
UITextRange *selectedRange = [textView markedTextRange];
//获取高亮部分
UITextPosition *position = [textView positionFromPosition:selectedRange.start offset:0];
// 没有高亮选择的字,则对已输入的文字进行字数统计和限制
if (!position) {
//输入完成后,是否会超出长度
if (toBeString.length + text.length > 20 & text.length >0) {
return NO;
}
}
NSUInteger stringUtf8Length = [text lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
if(stringUtf8Length >= 4 && (stringUtf8Length / text.length != 3)) {//输入法表情例如:🌺,😆
return NO;
}
}else if ([lang isEqualToString:@"emoji"]){
return NO;
}else{
if (toBeString.length > 20) {
return NO;
}
}
return YES;
}