Подтвердить что ты не робот

Как отключить клавиатуру emoji iOS 8?

Есть ли возможность прекратить показ клавиатуры emoji в iOS 8? Он недоступен в numpad и защищенном тексте, но для электронной почты он есть. Если невозможно отключить его, как получить строковые значения из emoji?

4b9b3361

Ответ 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.

enter image description here

Ответ 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 =)