Solução
Aqui está uma solução completa / solução alternativa para esse problema, vote na resposta de Blld também, porque essa era a parte vital de informação necessária!
Títulos alternativos para ajudar na pesquisa
- Mostrando o teclado Emoji como padrão para um objeto UIKeyInput (no iOS 13)
- Forçar o iOS 13 a mostrar o teclado Emoji
- Configurando o
UITextInputMode.primaryLanguage
emoji - Defina programaticamente o teclado como emoji
Antes do ios13, retornar o UITextInputMode
com primaryLanguage
"igual emoji" seria o padrão para mostrar o teclado emoji (veja a imagem abaixo).
Exemplo de código para retornar o "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
}
}
A execução desse código no iOS 12 definirá o teclado para o teclado Emoji do sistema, mas no iOS 13 isso não afetará.
Isto é um erro conhecido? Existe uma solução alternativa?
Atualizações
- Solicitada pelo @Navillus , a lista completa de "modos de entrada ativos" é; "en-GB", "emoji"
- Testado e confirmado em; 13.0, 13.1, 13.1.1, 13.1.2 e 13.2 (semente 1)
Respostas:
Arquivei um radar para o iOS 13 porque tenho um aplicativo bilíngue em japonês / inglês. Alguns campos são japoneses e outros ingleses, portanto, obviamente, faz sentido apresentar o tipo de teclado correto ao usuário, em vez de fazê-lo girar 20 vezes.
Havia uma solução alternativa para isso, e era isso que, após o UIKit chamar 'textInputMode', no thread principal, você poderia fazer isso:
Isso força o teclado a recarregar depois de responder com o textInputMode que você queria. Eu os informei sobre o bug e a solução alternativa para obter o comportamento correto.
Portanto, no iOS 13.1, o bug não foi corrigido, mas eles bloquearam minha solução alternativa.
Agradável. Não relatarei nenhum erro a eles novamente. Se encontrar uma solução alternativa, apenas a utilizarei.
Parece que agora eles estão desativando silenciosamente esse recurso. E é um recurso, esse é literalmente o objetivo dessa chamada de método, para descobrir qual modo de entrada deve ser apresentado ao usuário.
Ele ainda funciona ok embora se você tiver outra língua e deseja selecionar Inglês.
Portanto, se meu usuário definir japonês como a seleção de teclado, eu posso forçar um teclado em inglês. Apenas não o contrário. Qualquer tentativa de obter um modo de entrada japonês acaba em um teclado em inglês.
EDITAR:
Há outro caminho que você pode solucionar, mas envolve a descoberta e o uso da API interna, o que não é simples. Você precisaria essencialmente encontrar as funções usadas para gerenciar os resultados de pressionar o botão do globo. Se você fizer isso, simulará essencialmente os toques do usuário e os efeitos serão amplos, ou seja, o teclado também será alterado para outros aplicativos. Portanto, não é recomendado, 100% falhará no envio da App Store. Não quero publicá-lo por causa dos resultados da minha última solução alternativa.
Eu acho que não é possível entender a Apple com muita facilidade. Tudo o que sei é que:
Portanto, soluções alternativas futuras devem ser armazenadas até que suas intenções sejam claras e / ou eles corrijam esse bug (que é o que deveriam fazer). Simplesmente revogar parte da API sem publicar a alteração é um erro grave.
fonte
Parece ser um bug do iOS 13, a solução alternativa (para dispositivos, isso não afeta o Simulador) é substituir a
textInputContextIdentifier
propriedade e retornar um valor não nulo.fonte
Você precisa definir
textinputcontextidentifier
no campo de texto para que o iOS saiba onde salvar o arquivo personalizado.textInputMode
Não está escrito no documento, mas funciona.
ref: https://developer.apple.com/documentation/uikit/uiresponder/1621091-textinputcontextidentifier
fonte
"emoji"
ou""
paratextInputContextIdentifier
no meu costumeUITextField
mostra o teclado Emoji (quando combinado com atextInputMode
substituição na pergunta). Obrigado pela dica sobre os documentos ocultos. B