Показ системної клавіатури Emoji за замовчуванням на iOS 13


17

Рішення

Ось повне рішення / робота навколо цієї проблеми, будь ласка , вгору голосувати Blld в відповідь , а тому , що це було життєво біт інформації необхідно!

Альтернативні назви для пошуку пошуку

  • Показ клавіатури Emoji за замовчуванням для об'єкта UIKeyInput (в iOS 13)
  • Примушуйте iOS 13 показати клавіатуру Emoji
  • Встановлення UITextInputMode.primaryLanguageемоджи
  • Програматично встановити клавіатуру на емоджи

До повернення UITextInputMode з primaryLanguageтакою, що дорівнює "емоджі", за замовчуванням відображатиметься клавіатура 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, але на 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) -> String взамін m.primaryLanguage ?? ""}))
Navillus

@Navillus - відповідає на запитання, його "en-GB" та "emoji"
rjstelling

1
Тепер це виправлено в iOS 13.4 / Xcode 11.4
Stephen

Відповіді:


9

Про це я подав радіолокацію для iOS 13, оскільки у мене є двомовна японська / англійська програма. Деякі поля - японські, а деякі - англійська, тому очевидно, що має сенс подавати користувачеві правильний тип клавіатури, а не примушувати їх перевертати назад і назад 20 разів.

Для цього було вирішено, і це було те, що після викликів UIKit "textInputMode", у головному потоці ви могли це зробити:

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

Це змушує клавіатуру перезавантажуватись після відповіді з текстовим входом, який ви хотіли. Я поінформував їх про помилку та спосіб вирішення правильної поведінки.

Так в iOS 13.1 помилка не була виправлена, проте вони заблокували моє вирішення.

Приємно. Я більше не повідомлятиму про них жодних помилок. Швидше, якщо я знайду вирішення, я просто його використаю.

Тож здається, що зараз вони мовчки відключають цю функцію. І це особливість, це буквально мета цього виклику методу, щоб з’ясувати, який режим введення повинен бути представлений користувачеві.

Він все ще працює нормально, хоча ви маєте іншу мову та хочете вибрати англійську.

Отже, якщо мій користувач встановив японську як вибір клавіатури, то я можу примусити англійську клавіатуру. Тільки не навпаки. Будь-які спроби отримати режим японського введення закінчуються на англійській клавіатурі.

Редагувати:

Існує ще один шлях, який можна обійти, але він включає відкриття та використання внутрішнього API, що не є простим. Потрібно, по суті, знайти функції, які використовуються для керування результатами натискання на кнопку земної кулі. Якщо ви зробите це, ви по суті моделюєте вказівки користувача, і це має широкі ефекти, тобто клавіатура буде змінена і для інших додатків. Тож це не рекомендується, на 100% це не вдасться подати App Store. Я не хочу публікувати це через результати мого останнього вирішення.

Я думаю, що неможливо зрозуміти Apple дуже легко. Все, що я знаю, це:

  1. API не працює, як опубліковано
  2. повідомлялося, що вони не виправили помилку
  3. з моменту звітування вони порушили (навмисно чи ні) обхід

Тож майбутні шляхи вирішення проблеми слід зберігати, поки їхні наміри не з’ясуються та / або вони не виправлять цю помилку (що саме вони повинні робити). Просто відкликання частини API без публікації змін є основною помилкою.


Дякую за це! Це допомогло мені трохи більше зрозуміти це. Я сумніваюся, що вони навмисно заблокували ваше вирішення, мені це більше подобається помилка. Якщо вони хотіли видалити цю функцію, вони могли б її знехтувати.
rjstelling

"Ніколи не приписуйте злобі те, що адекватно пояснюється дурістю".
rjstelling

Хтось знайшов інше рішення для цього?
shujaat

8

Примітка. Переконайтеся, що у вас включена клавіатура Emoji.

Це здається помилкою в 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 за його відповідь.


1
У мене виникають однакові проблеми, коли відображається англійська десяткова колодка. Мова мого додатка - арабською мовою, і я хочу, щоб у моєму текстовому полі відображалася десяткова англійська англійська мова. Я зробив вищезазначені кроки, змінивши ці варіанти та методи. У textInputMode я повертаю лише режим "en-US", але все-таки він показує
арабську

Не працює для мене на iOS 13.2
atereshkov

Я можу підтвердити, що це, здається, не працює для iOS 13.2 ...
Джей Лі

@JayLee Переконайтеся, що у вас включена клавіатура Emoji
rjstelling

7

Потрібно встановити textinputcontextidentifierна textField так, щоб iOS знав, де зберегти звичайtextInputMode

Це не написано в документі, але працює.

посилання: https://developer.apple.com/documentation/uikit/uiresponder/1621091-textinputcontextidentifier


2
Це працювало для мене на iOS 13. Просто повернення "emoji"або ""за textInputContextIdentifierмоїм звичаєм UITextFieldпоказує клавіатуру Emoji (у поєднанні з textInputModeпереопрацюванням у питанні). Дякуємо за пораду щодо прихованих документів. 👍
Baza207

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