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.primaryLanguage
emoji - Réglez le clavier en emoji par programmation
Avant ios13, renvoyer le UITextInputMode
avec primaryLanguage
cet "emoji" égal aurait par défaut pour afficher le clavier Emoji (voir l'image ci-dessous).
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)
Réponses:
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:
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:
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.
la source
Cela semble être un bogue iOS 13, le travail (pour les appareils, cela n'affecte pas le simulateur) consiste à remplacer la
textInputContextIdentifier
propriété et à renvoyer une valeur non nulle.la source
Vous devez définir
textinputcontextidentifier
sur 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
la source
"emoji"
ou""
pourtextInputContextIdentifier
mes personnalisésUITextField
montre le clavier Emoji (lorsqu'il est combiné avec letextInputMode
remplacement dans la question). Merci pour le conseil sur les documents cachés. 👍