Отображение системной клавиатуры Emoji по умолчанию на iOS 13 - PullRequest
13 голосов
/ 30 сентября 2019

Решение

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

Альтернативные заголовки для облегчения поиска

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

до возврат UITextInputMode с primaryLanguage, который равнялся "emoji", по умолчанию показывал клавиатуру Emoji (см. изображение ниже).

Emoji keyboard screen shot

Пример кода для возврата «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, но на iOS 13 это никак не повлияет.

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

Обновления

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

Ответы [ 3 ]

7 голосов
/ 03 октября 2019

Я подал радар об этом для 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 без публикации изменений является серьезной ошибкой.

3 голосов
/ 24 октября 2019

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

//
//  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 за его ответ.

3 голосов
/ 24 октября 2019

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

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

ref: https://developer.apple.com/documentation/uikit/uiresponder/1621091-textinputcontextidentifier

...