web-dev-qa-db-fra.com

Affichage du clavier Emoji système par défaut sur iOS 13

Solution

Voici un solution complète/travail autour de ce problème, veuillez également voter pour Blld réponse parce que c'était le peu essentiel d'informations nécessaires!

Titres alternatifs pour faciliter la recherche

  • Affichage du clavier Emoji par défaut pour un objet UIKeyInput (dans iOS 13)
  • Forcer iOS 13 à montrer le clavier Emoji
  • Réglage du UITextInputMode.primaryLanguage en emoji
  • Réglez le clavier sur emoji par programmation

Avant ios1 renvoyer le UITextInputMode avec primaryLanguage égal à "emoji" afficherait par défaut le clavier Emoji (voir l'image ci-dessous).

Emoji keyboard screen shot

Exemple de code pour retourner le "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
    }
}

L'exécution de ce code sur iOS 12 définira le clavier sur le clavier Emoji du système, mais sur iOS 13, cela n'a aucun effet.

Est-ce un bug connu? Y at-il un travail autour?

Mises à jour

  • Demandé par @ Navillus , la liste complète des "modes d'entrée actifs" est; "en-GB", "emoji"
  • Testé et confirmé le; 13.0, 13.1, 13.1.1, 13.1.2 et 13.2 (graine 1)
17
rjstelling

NB: Assurez-vous que le clavier Emoji est activé.

Cela semble être un bogue iOS 13, le travail (pour les appareils, cela n'affecte pas le simulateur) consiste à remplacer la propriété textInputContextIdentifier et à renvoyer une valeur non nulle.

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

Merci à blld pour sa réponse.

8
rjstelling

J'ai déposé un radar à ce sujet pour iOS 13 car j'ai une application bilingue japonais/anglais. Certains champs sont japonais et certains anglais, il est donc logique de présenter le bon type de clavier à l'utilisateur au lieu de les faire basculer 20 fois d'avant en arrière.

Il y avait une solution de contournement pour cela, et c'est qu'après que l'UIKit ait appelé 'textInputMode', dans le thread principal, vous pouviez faire ceci:

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

Cela force le clavier à se recharger après avoir répondu avec le textInputMode que vous vouliez. Je les ai informés du bogue et de la solution de contournement pour obtenir un comportement correct.

Donc, dans iOS 13.1, le bogue n'était pas corrigé, mais ils ont bloqué ma solution.

Agréable. Je ne leur signalerai plus aucun bogue. Plutôt, si je trouve une solution de contournement, je vais simplement l'utiliser.

Il semble donc qu'ils désactivent désormais cette fonctionnalité en silence. Et c'est une fonctionnalité, c'est littéralement le but de cet appel de méthode, de savoir quel mode d'entrée doit être présenté à l'utilisateur.

Il fonctionne toujours bien si vous avez une autre langue et que vous souhaitez sélectionner l'anglais.

Donc, si mon utilisateur définit le japonais comme sélection de clavier, je peux forcer un clavier anglais vers le haut. Mais pas l'inverse. Toutes les tentatives pour obtenir un mode d'entrée japonais se retrouvent dans un clavier anglais.

ÉDITER:

Il existe un autre chemin que vous pouvez contourner, mais cela implique la découverte et l'utilisation d'API interne, ce qui n'est pas simple. Vous devez essentiellement trouver les fonctions utilisées pour gérer les résultats de la frappe du bouton globe. Si vous faites cela, vous simulez essentiellement les frappes de l'utilisateur et cela a de nombreux effets, c'est-à-dire que le clavier sera également changé pour d'autres applications. Ce n'est donc pas recommandé, à 100%, la soumission sur l'App Store échouera. Je ne veux pas le publier en raison des résultats de ma dernière solution de contournement.

Je pense qu'il n'est pas possible de comprendre très facilement Apple. Tout ce que je sais, c'est que:

  1. l'API ne fonctionne pas comme publié
  2. il a été signalé et ils n'ont pas corrigé le bogue
  3. depuis le moment du signalement, ils ont rompu (intentionnellement ou non) la solution de contournement

Les solutions de contournement futures devraient donc être thésaurisées jusqu'à ce que leurs intentions soient claires et/ou qu'elles corrigent ce bogue (ce qu'elles devraient faire). La simple révocation d'une partie de l'API sans publier la modification est un bug majeur.

9
dbquarrel

Vous devez définir textinputcontextidentifier sur le textField afin que iOS sache où enregistrer le textInputMode personnalisé

Ce n'est pas écrit dans le doc mais ça marche.

réf: https://developer.Apple.com/documentation/uikit/uiresponder/1621091-textinputcontextidentifier

7
blld