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

17

Solution

Voici une solution complète / contourner ce problème, veuillez également voter la réponse de Blld 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
  • Définition de l' UITextInputMode.primaryLanguageemoji
  • Réglez le clavier en emoji par programmation

Avant renvoyer le UITextInputModeavec primaryLanguagecet "emoji" égal aurait par défaut pour afficher le clavier Emoji (voir l'image ci-dessous).

Capture d'écran du clavier Emoji

Exemple de code pour retourner les "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)
rjstelling
la source
Chose amusante: j'ai réussi à exécuter ce code avec succès sur le simulateur, mais pas sur l'appareil. iOS 13 pour les deux. Maintenant, je suis intrigué.
Marina Aguilar
A aussi fonctionné pour moi dans un simulateur. @rjstelling Quelle est la liste complète des ActiveInputModes sur votre appareil? Vous pouvez vérifier avec ceci: print (UITextInputMode.activeInputModes.map ({(m) -> String en retour m.primaryLanguage ?? ""}))
Navillus
@Navillus - réponses à la question, ses "en-GB" et "emoji"
rjstelling
1
Ceci est maintenant corrigé dans iOS 13.4 / Xcode 11.4
Stephen

Réponses:

9

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 d'avant en arrière 20 fois.

Il y avait une solution de contournement pour cela, et c'était 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 résolu, 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 juste 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.

Cela 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 Apple très facilement. 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.

dbquarrel
la source
Merci pour cela! Cela m'a aidé à mieux comprendre cela. Je doute qu'ils aient délibérément bloqué votre solution de contournement, cela ressemble plus à un bug pour moi. S'ils voulaient supprimer la fonctionnalité, ils pouvaient la déprécier.
rjstelling
"N'attribuez jamais à la méchanceté ce qui est adéquatement expliqué par la stupidité."
rjstelling
Quelqu'un at-il trouvé une autre solution pour cela?
shujaat
8

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 textInputContextIdentifierpropriété 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.

rjstelling
la source
1
J'ai le même type de problème en montrant le pavé décimal anglais. La langue de mon application est en arabe et je veux que mon champ de texte affiche le pavé décimal anglais. J'ai fait les étapes mentionnées ci-dessus en remplaçant ces vars et méthodes. Dans textInputMode, je retourne uniquement le mode "en-US", mais il montre toujours le pavé décimal arabe dans iOS 13.
shujaat
Ne fonctionne pas pour moi sur iOS 13.2
atereshkov
Je peux confirmer que cela ne semble plus fonctionner pour iOS 13.2 ...
Jay Lee
@JayLee Assurez-vous que le clavier Emoji est activé
rjstelling
7

Vous devez définir textinputcontextidentifiersur le textField pour que iOS sache où enregistrer la personnalisationtextInputMode

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

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

blld
la source
2
Cela a fonctionné pour moi sur iOS 13. Je viens de revenir "emoji"ou ""pour textInputContextIdentifiermes personnalisés UITextFieldmontre le clavier Emoji (lorsqu'il est combiné avec le textInputModeremplacement dans la question). Merci pour le conseil sur les documents cachés. 👍
Baza207
Ne fonctionne pas lorsque nous voulons appliquer le pavé décimal anglais pour un UITextField lorsque la localisation de l'application est en arabe.
shujaat