我們在開發(fā)過程中,可能會遇到一些需要控制輸入長度的需求灭忠,比如取名標(biāo)題之類的膳算;
一些情況下,我們限制的字符數(shù)叫短弛作,然而用戶使用拼音輸入時涕蜂,還未完成漢字拼寫,而拼音已經(jīng)高亮展示再textView上映琳,這時候机隙,每個拼音是占位的,有時會阻止我們完成輸入萨西,從而達不到最高輸入漢字的數(shù)量有鹿。
對了,還有一種情況需求需要我們屏蔽掉表情谎脯,包括輸入法葱跋,輸入拼音時所展示的表情圖案,比如:??源梭、??
輸入法花@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];
// 沒有高亮選擇的字,則對已輸入的文字進行字?jǐn)?shù)統(tǒng)計和限制
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;
}