Есть ли возможность прекратить показ клавиатуры emoji в iOS 8? Он недоступен в numpad и защищенном тексте, но для электронной почты он есть. Если невозможно отключить его, как получить строковые значения из emoji?
Как отключить клавиатуру emoji iOS 8?
Ответ 1
Попробуйте следующее:
- (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;
}
для получения дополнительной информации см. здесь.
EDIT:
С помощью этого кода вы можете скрыть emoji с клавиатуры:
txtField.keyboardType=UIKeyboardTypeASCIICapable;
EDIT:
Скрыть выбор emoji с клавиатуры с помощью конструктора Interface.

Ответ 2
Это работает на iOS 7 и 8:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
// Disable emoji input
return [textField textInputMode] != nil;
}
Ответ 3
Решение, которое сработало для меня:
self.texField.keyboardType = UIKeyboardTypeASCIICapable;
Клавиатура emoji не будет доступна с этим KeyboardType.
Но это обязательно, чтобы проверить тип каждого char, добавленного в textField, поскольку пользователь может скопировать emoji из другого места, а затем вставить его.
Вот как вы могли это сделать:
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
return [text canBeConvertedToEncoding:NSASCIIStringEncoding];
}
Предупредите, что, поскольку я читаю в другом сообщении, это может также помешать пользователю использовать клавиатуру со специальными символами, например, китайскую.
Ответ 4
Просто чтобы обновить большие ответы выше для тех, кто сталкивается с теми же проблемами, что и я:
- Поле электронной почты, заданное как keyboardType =.EmailAddress, все еще позволяет emojis
- У вас может быть несколько условий, которые вы хотите отфильтровать.
- Swift
- Предотвращение C & P
Вот как мы это сделали:
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
if !string.canBeConvertedToEncoding(NSASCIIStringEncoding){
return false
}
//other conditons
}
Edit
Хорошо, что решение с NSASCIIStringEncoding не подходит, если вы хотите разрешить определенные символы для других языков.
Некоторые буквы заблокированы с помощью NSASCIIStringEncoding:
- Все остальные версии a: àáâäæãåā
- Все другие версии e: èéêëēėę
- Все другие версии o: ôöòóœøōõ
Использование NSASCIIStringEncoding - не очень хорошая идея, если вы хотите поддерживать пользователей из других стран!
Я также попробовал NSISOLatin1StringEncoding:
- Заблокированные версии a: ā
- Заблокированные версии e: ēėę
- Заблокированные версии o: œø
Это намного лучше.
Я также попробовал NSISOLatin2StringEncoding:
- Заблокированные версии a: àæãåā
- Заблокированные версии e: èêēė
- Заблокированные версии o: òœøōõ
хуже.
Edit2:
Кажется, что работает следующее:
extension String {
func containsEmoji() -> Bool {
for i in self.characters {
if i.isEmoji() {
return true
}
}
return false
}
}
extension Character {
func isEmoji() -> Bool {
return Character(UnicodeScalar(0x1d000)) <= self && self <= Character(UnicodeScalar(0x1f77f))
|| Character(UnicodeScalar(0x1f900)) <= self && self <= Character(UnicodeScalar(0x1f9ff))
|| Character(UnicodeScalar(0x2100)) <= self && self <= Character(UnicodeScalar(0x26ff))
}
}
Теперь мы вызываем:
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
if string.containsEmoji() {
return false
}
//other conditons
}
Ответ 5
В быстрой версии 3.0
textField.keyboardType = .asciiCapable
Ответ 6
Это быстрая версия.
func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
if textView.isFirstResponder() {
if textView.textInputMode?.primaryLanguage == nil || textView.textInputMode?.primaryLanguage == "emoji" {
return false;
}
}
return true;
}
Ответ 7
Решение Swift 3.1
// MARK: - Text Field Delegate
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
return textField.textInputMode != nil
}
Ответ 8
В Swift: - Это ограничит прошлое emoji в вашем TextView и просто изменит тип клавиатуры на ascii, способный
func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
var result = Bool()
let disallowedCharacterSet1 = NSCharacterSet.symbolCharacterSet()
let replacementStringIsLegal = text.rangeOfCharacterFromSet(disallowedCharacterSet1) == nil
result = replacementStringIsLegal
let newLength = textView.text!.utf16.count + text.utf16.count - range.length
return newLength <= 300 && result // Bool
}
Ответ 9
Мне нужен был ответ для Swift 3.0, который работал бы на shouldChangeTextInRange и придумал следующее, что действительно просто и может обрабатывать любой язык, который вы на него набрасываете (я включаю фотографию с помощью китайского для демонстрации).
Оператор guard разворачивает необязательный текст, а оператор return проверяет, вытащил ли он значение, удовлетворяющее проверке trimmingCharacters. Если есть значение (это означает, что он не является частью текущего языка ввода устройств), он не будет пустым, поэтому метод возвращает false и не позволяет вводить символ.
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
guard let text = (textField.text as NSString?)?.replacingCharacters(in: range, with: string) else {
return true
}
return text.trimmingCharacters(in: CharacterSet.alphanumerics).isEmpty
}
Это зависит от Apple CharacterSet.alphanumerics, поэтому нет необходимости поддерживать и обновлять список утвержденных символов, если вы не хотите добавлять или удалять элементы.
Yay для языкового агностика!
Другое распространенное использование - для электронной почты, поскольку электронная почта по умолчанию обеспечивает emojis. Я нашел с небольшой модификацией, я смог ограничить символы тем, что я хотел для работы с адресом электронной почты.
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
guard let text = (textField.text as NSString?)?.replacingCharacters(in: range, with: string) else {
return true
}
return text.trimmingCharacters(in: CharacterSet.alphanumerics).isEmpty ||
!text.characters.filter { $0 == "@" || $0 == "." }.isEmpty
}
Ответ 10
Хотя вопрос супер старый, Я столкнулся с той же проблемой и смог ее решить к моменту загрузки этой страницы этим небольшим трюком:
Просто выберите "ASCII Capable" или "Numbers and Punctuations" в Interface Builder Xcode 8.2.1
Выход не содержит клавиатуры Emoji = D
Я уверен, что это поможет Someone =)



