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

我們在開發過程中,可能會遇到一些需要控制輸入長度的需求,比如取名標題之類的;
一些情況下,我們限制的字符數叫短,然而用戶使用拼音輸入時,還未完成漢字拼寫,而拼音已經高亮展示再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;
}
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容