2014-09-16 3 views
31

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

+1

возможно дубликат [Как отключить Emoji клавиатуры в прошивкой 7?] (Http://stackoverflow.com/questions/24927351/ how-to-disable-the-emoji-keyboard-in-ios-7) –

ответ

82

Попробуйте это:

- (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; 
} 

для получения дополнительной информации см here.

EDIT:

Вы можете скрыть смайлик с клавиатуры, используя этот код:

txtField.keyboardType=UIKeyboardTypeASCIICapable; 

EDIT:

Скрыть выбор Emoji с клавиатуры, используя построитель интерфейса.

enter image description here

+3

Другой совет: вы можете установить это прямо из Xcode/Interface Builder. – BastiBen

+1

Скрываясь в IB, приятно. Мне нравится. Благодарю. – Noundla

+1

Если emoji скопирован из другого текстового поля, эта проверка должна быть выполнена, если только символы ASCII приняты string.canBeConvertedToEncoding (NSASCIIStringEncoding), или если только emoji следует удалить, эту lib можно использовать https://github.com/woxtu/NSString-RemoveEmoji –

16

Это работает на прошивке 7 и 8:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    // Disable emoji input 
    return [textField textInputMode] != nil; 
} 
+0

Единственное, что на самом деле работает без устаревших методов! –

7

Решение, которое работало для меня:

self.texField.keyboardType = UIKeyboardTypeASCIICapable; 

смайликов клавиатура не будет доступен с этим KeyboardType. .

Но это обязательно проверить вид каждого использовал строку добавляется в текстовом поле, так как пользователь может скопировать смайлик из других затем вставить его в

Вот как вы могли бы сделать так:

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { 
    return [text canBeConvertedToEncoding:NSASCIIStringEncoding]; 
} 

Будьте предупреждены, что, как я читал в другом посте, это может также помешать пользователю использовать клавиатуру со специальными символами, например, китайскую.

+1

Это должен быть принятый ответ, так как люди все еще могут копировать/вставлять emoji с принятым ответом выше – tettoffensive

7

Просто обновить большие ответы выше для тех, кто сталкивается с теми же проблемами, что и я:

  1. Поле электронной почты устанавливается как keyboardType = .EmailAddress еще позволяет Emojis
  2. Вы можете иметь более чем одно условие вы хотите для фильтрации
  3. Свифта
  4. Предотвратить с & Р

Это, как ш е сделал это:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { 
    if !string.canBeConvertedToEncoding(NSASCIIStringEncoding){ 
     return false 
    } 
    //other conditons 
} 

Редактировать

Хорошо решение с NSASCIIStringEncoding не хорошо, если вы хотите, чтобы определенные символы для других языков.

Некоторые буквы блокированные NSASCIIStringEncoding:

  • Все остальные версий: àáâäæãåā
  • Все другие версии е: èéêëēėę
  • Все другие версии O: ôöòóœøōõ

Использование NSASCIIStringEncoding - не очень хорошая идея, если вы хотите поддерживать пользователей из других стран!

Я также попытался NSISOLatin1StringEncoding:

  • Блокированные версии A:
  • Блокированные версии Е: EEE
  • блокированных версии O: œo

Это намного лучше ясно.

Я также попытался NSISOLatin2StringEncoding:

  • блокированных версиях: àæãåā
  • блокированных версий е: ээээ
  • блокированных версии 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 
} 
1

Это быстры версия.

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; 
} 
0

В Swift: - Это ограничит в прошлом смайликов в вашем 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 

} 
0

Я хотел ответ на Swift 3.0, который будет работать на shouldChangeTextInRange и придумал следующее, что действительно просто и может обрабатывать любой язык, который вы бросаете на него (я показываю фотографию с помощью китайского для демонстрации).

Оператор охраны разворачивает необязательный текст, и оператор возврата проверяет, не вытащил ли оно значение, которое удовлетворило проверку 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, так что нет никакой необходимости поддерживать и обновлять список разрешенных символов, если вы не хотите, чтобы добавить или удалить элементы.

enter image description here

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 
} 
5

В стремительной 3.0

textField.keyboardType = .asciiCapable

2

Swift 3.1 Решение

// MARK: - Text Field Delegate 

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 
     return textField.textInputMode != nil 
    } 
0

Хотя Вопрос супер стар, я Столкнувшись с той же проблемой и смог решить ее к тому времени этой странице загружается с помощью этой небольшой трюк:

Просто выберите «ASCII Способен» или «Число и пунктуацию» в Interface Builder Xcode 8.2.1

enter image description here enter image description here

Выход есть нет Emoji клавиатуры = D

enter image description here

Я уверен, что это кому-то помочь =)

+0

Пожалуйста, не добавляйте [тот же ответ на несколько вопросов] (http://meta.stackexchange.com/questions/104227/is -Он приемлемых к надстройке а-дубликат-ответа-на-несколько-вопросов). Ответьте на лучшее и отметьте остальное как дубликаты, как только вы заработаете достаточно репутации. Если это не дубликат, приспособить сообщение к вопросу и флаг для удаления. –

Смежные вопросы