UITextView输入中文时避免拼音高亮站位及输入法表情屏蔽

我们在开发过程中,可能会遇到一些需要控制输入长度的需求,比如取名标题之类的;
一些情况下,我们限制的字符数叫短,然而用户使用拼音输入时,还未完成汉字拼写,而拼音已经高亮展示再textView上,这时候,每个拼音是占位的,有时会阻止我们完成输入,从而达不到最高输入汉字的数量。
对了,还有一种情况需求需要我们屏蔽掉表情,包括输入法,输入拼音时所展示的表情图案,比如:、


UITextView输入中文时避免拼音高亮站位及输入法表情屏蔽_第1张图片
输入法花@2x.png
UITextView输入中文时避免拼音高亮站位及输入法表情屏蔽_第2张图片
输入法笑@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;
}

你可能感兴趣的:(UITextView输入中文时避免拼音高亮站位及输入法表情屏蔽)