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
UITextInputMode.primaryLanguage
en emojiAvant ios1 renvoyer le UITextInputMode
avec primaryLanguage
égal à "emoji" afficherait par défaut le clavier Emoji (voir l'image ci-dessous).
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
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.
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:
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.
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