Есть ли возможность прекратить показ клавиатуры 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 =)