Отображение системной клавиатуры Emoji по умолчанию на iOS 13


17

Решение

Вот полное решение / обходной путь для этой проблемы, пожалуйста, проголосуйте также за ответ Blld, потому что это была необходимая информация!

Альтернативные названия, чтобы помочь поиску

  • Отображение клавиатуры Emoji по умолчанию для объекта UIKeyInput (в iOS 13)
  • Заставьте iOS 13 показать клавиатуру Emoji
  • Настройка UITextInputMode.primaryLanguageсмайликов
  • Программно установить клавиатуру на смайлики

До Возвращая UITextInputModeс primaryLanguageэтими составившими «смайликами» по умолчанию будет показывать клавиатуры Emoji (смотрите изображение ниже).

Снимок экрана Emoji клавиатуры

Пример кода для возврата "emoji" UITextInputMode.

//
//  ViewController.swift
//  Keyboard Info
//
//  Created by Richard Stelling on 30/09/2019.
//  Copyright © 2019 Richard Stelling. All rights reserved.
//

import UIKit

class TestButton: UIButton, UIKeyInput {

    var hasText: Bool = true

    func insertText(_ text: String) { print("\(text)") }

    func deleteBackward() {}


    override var canBecomeFirstResponder: Bool { return true }

    override var canResignFirstResponder: Bool { return true }

    override var textInputMode: UITextInputMode? {
        for mode in UITextInputMode.activeInputModes {
            if mode.primaryLanguage == "emoji" {
                return mode
            }
        }
        return nil
    }
}

Запуск этого кода на iOS 12 приведет к установке клавиатуры на систему Emoji Keyboard, но на iOS 13 это никак не повлияет.

Это известная ошибка? Есть ли обходной путь?

Обновления

  • Запрашивается @Navillus , полный список «активных режимов ввода»: "en-GB", "emoji"
  • Проверено и подтверждено на; 13.0, 13.1, 13.1.1, 13.1.2 и 13.2 (семя 1)

Забавно: мне удалось успешно запустить этот код на симуляторе, но не на устройстве. iOS 13 для обоих. Теперь я заинтригован.
Марина Агилар

У меня тоже работал в симуляторе. @rjstelling Каков полный список activeInputModes на вашем устройстве? Вы можете проверить это: print (UITextInputMode.activeInputModes.map ({(m) -> возвращаемая строка m.primaryLanguage ?? ""}))
Navillus

@Navillus - ответы на вопрос, его "en-GB" и "
emoji

1
Это теперь исправлено в iOS 13.4 / Xcode 11.4
Стивен

Ответы:


9

Я подал радар об этом для iOS 13, потому что у меня есть двуязычное японское / английское приложение. Некоторые поля - японские, а некоторые - английские, поэтому, очевидно, имеет смысл представить пользователю правильный тип клавиатуры, а не переворачивать их назад и вперед 20 раз.

Был обходной путь для этого, и это было то, что после того, как UIKit вызывает textInputMode, в главном потоке вы можете сделать это:

// has to be done after the textInputMode method is called
if #available(iOS 13, *) {
    textField.keyboardType = textField.keyboardType
} 

Это заставляет клавиатуру перезагружаться после ответа нужным вам textInputMode. Я проинформировал их об ошибке и обходном пути, чтобы получить правильное поведение.

Так что в iOS 13.1 ошибка не была исправлена, однако они заблокировали мой обходной путь.

Ницца. Я не буду сообщать им об ошибках снова. Скорее, если я найду обходной путь, я просто буду его использовать.

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

Это все еще работает нормально, если у вас есть другой язык и вы хотите выбрать английский.

Так что, если мой пользователь установит японский язык в качестве выбора клавиатуры, я смогу включить английскую клавиатуру. Просто не наоборот. Любые попытки получить японский режим ввода заканчиваются на английской клавиатуре.

РЕДАКТИРОВАТЬ:

Есть еще один путь, который вы можете обойти, но он включает в себя обнаружение и использование внутреннего API, который не является простым. Вы должны были бы по существу найти функции, используемые для управления результатами нажатия кнопки глобуса. Если вы сделаете это, вы по сути будете имитировать нажатия пользователя, и у него будет широкий спектр эффектов, то есть клавиатура будет заменена и для других приложений. Так что это не рекомендуется, 100% это не получится в App Store. Я не хочу публиковать его из-за результатов моего последнего обходного пути.

Я думаю, что понять Apple не так просто. Все, что я знаю, это что:

  1. API не работает как опубликовано
  2. было сообщено, и они не исправили ошибку
  3. с момента сообщения они сломали (намеренно или нет) обходной путь

Поэтому будущие обходные пути следует скрывать до тех пор, пока их намерения не станут ясными и / или они не исправят эту ошибку (что они и должны делать). Простая отмена части API без публикации изменений является серьезной ошибкой.


Спасибо за это! Это помогло мне понять это немного больше. Я сомневаюсь, что они намеренно заблокировали ваш обходной путь, для меня это больше похоже на ошибку. Если бы они хотели удалить функцию, они могли бы отказаться от нее.
rjstelling

«Никогда не приписывайте злобе то, что адекватно объясняется глупостью».
rjstelling

Кто-нибудь нашел другой обходной путь для этого?
shujaat

8

NB. Убедитесь, что у вас включена клавиатура Emoji.

Похоже, что это ошибка iOS 13, обходной путь (для устройств, это не влияет на симулятор) - переопределить textInputContextIdentifierсвойство и вернуть значение, отличное от nil.

//
//  ViewController.swift
//  Keyboard Info
//
//  Created by Richard Stelling on 30/09/2019.
//  Copyright © 2019 Richard Stelling. All rights reserved.
//

import UIKit

class TestButton: UIButton, UIKeyInput {

    var hasText: Bool = true

    override var textInputContextIdentifier: String? { "" } // return non-nil to show the Emoji keyboard ¯\_(ツ)_/¯ 

    func insertText(_ text: String) { print("\(text)") }

    func deleteBackward() {}

    override var canBecomeFirstResponder: Bool { return true }

    override var canResignFirstResponder: Bool { return true }

    override var textInputMode: UITextInputMode? {
        for mode in UITextInputMode.activeInputModes {
            if mode.primaryLanguage == "emoji" {
                return mode
            }
        }
        return nil
    }
}

Спасибо BLLD за его ответ.


1
У меня такая же проблема при отображении английской десятичной панели. Язык моего приложения арабский, и я хочу, чтобы в моем текстовом поле отображалась английская десятичная панель. Я сделал вышеупомянутые шаги, переопределяя эти переменные и методы. В textInputMode я возвращаю только режим «en-US», но все равно он показывает арабскую десятичную панель в iOS 13.
shujaat

У меня не работает на iOS 13.2
атерешков

Я могу подтвердить, что, похоже, это больше не работает для iOS 13.2 ...
Джей Ли,

@JayLee Убедитесь, что у вас включена клавиатура Emoji
rjstelling

7

Вам нужно установить textinputcontextidentifierна textField, чтобы iOS знала, где сохранить пользовательскийtextInputMode

Это не написано в документе, но это работает.

ссылка: https://developer.apple.com/documentation/uikit/uiresponder/1621091-textinputcontextidentifier


2
Это работает для меня на IOS 13. Just возвращения "emoji"или ""для textInputContextIdentifierв моих пользовательских UITextFieldпоказывает клавиатуру Emoji (в сочетании с textInputModeпереопределения в вопросе). Спасибо за совет по скрытым документам. 👍
База207

Не работает, когда мы хотим применить английскую десятичную панель для UITextField, когда локализация приложения на арабском языке.
shujaat
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.