遇到一個(gè)比較奇葩的需求蜜猾,輸入文字的時(shí)候不能輸入表情符號(hào)笋籽,但是現(xiàn)在蘋果支持新的Unicode標(biāo)準(zhǔn),本身就有一堆的emoji表情。沒辦法露乏,只能在輸入框上做文章碧浊,輸入的時(shí)候過濾掉emoji表情。關(guān)鍵的地方在于過濾方法瘟仿,下面是擴(kuò)展NSString的過濾方法:
// 檢查字符串是否包含emoji
- (BOOL)containsEmoji
{
__block BOOL contain = NO;
[self enumerateSubstringsInRange:NSMakeRange(0, self.length) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOL * _Nonnull stop) {
if ([substring isEmoji]) {
contain = YES;
*stop = YES;
}
}];
return contain;
}
// 檢查一個(gè)‘字符’是否是emoji表情
- (BOOL)isEmoji
{
if (self.length <= 0) {
return NO;
}
unichar first = [self characterAtIndex:0];
switch (self.length) {
case 1:
{
if (first == 0xa9 || first == 0xae || first == 0x2122 ||
first == 0x3030 || (first >= 0x25b6 && first <= 0x27bf) ||
first == 0x2328 || (first >= 0x23e9 && first <= 0x23fa)) {
return YES;
}
}
break;
case 2:
{
unichar c = [self characterAtIndex:1];
if (c == 0xfe0f) {
if (first >= 0x203c && first <= 0x3299) {
return YES;
}
}
if (first >= 0xd83c && first <= 0xd83e) {
return YES;
}
}
break;
case 3:
{
unichar c = [self characterAtIndex:1];
if (c == 0xfe0f) {
if (first >= 0x23 && first <= 0x39) {
return YES;
}
}
else if (c == 0xd83c) {
if (first == 0x26f9 || first == 0x261d || (first >= 0x270a && first <= 0x270d)) {
return YES;
}
}
if (first == 0xd83c) {
return YES;
}
}
break;
case 4:
{
unichar c = [self characterAtIndex:1];
if (c == 0xd83c) {
if (first == 0x261d || first == 0x270c) {
return YES;
}
}
if (first >= 0xd83c && first <= 0xd83e) {
return YES;
}
}
break;
case 5:
{
if (first == 0xd83d) {
return YES;
}
}
break;
case 8:
case 11:
{
if (first == 0xd83d) {
return YES;
}
}
break;
default:
break;
}
return NO;
}
具體過濾過程比較簡(jiǎn)單:
1箱锐、監(jiān)聽UITextFieldTextDidChangeNotification(UITextField)或者UITextViewTextDidChangeNotification(UITextView);
2劳较、記錄lastText驹止,在監(jiān)聽反饋中判斷新輸入的string是否存在emoji,是的話用lastText替換UITextField或者UITextView的內(nèi)容观蜗,達(dá)到不輸入emoji的目的臊恋,否則更新lastText為當(dāng)前UITextField或者UITextView的內(nèi)容。
最后效果如下:
用法很簡(jiǎn)單:只用設(shè)置一個(gè)屬性即可:
textField.shouldAvoidEmoji =YES;
textView.shouldAvoidEmoji =YES;
更新抖仅,更好的辦法在這里
1、如果你只想輸入英文砖第,不用輸入中文撤卢,那么過濾表情符號(hào)的話很簡(jiǎn)單:
textField.keyboardType=UIKeyboardTypeASCIICapable;
2、如果你想輸入中文梧兼,但是不想輸入表情符號(hào)放吩,那么可以實(shí)現(xiàn)代理方法:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if ([textField isFirstResponder])
{
if ([[[textField textInputMode] primaryLanguage] isEqualToString:@"emoji"] || ![[textField textInputMode] primaryLanguage])
{
return NO;
}
}
return YES;
}
參考:http://stackoverflow.com/questions/25861468/how-to-disable-ios-8-emoji-keyboard