ソリューション
これが 完全な解決策/作業 この問題の周りです。これはBlldの answer にも賛成投票してください。これは必要な情報の重要なビットでした。
検索に役立つ代替タイトル
UITextInputMode.primaryLanguage
を絵文字に設定していますios1 より前は、UITextInputMode
がprimaryLanguage
で "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
}
}
このコードをiOS 12で実行すると、キーボードがシステムの絵文字キーボードに設定されますが、iOS 13では影響がありません。
これは既知のバグですか?回避策はありますか?
更新
注意:絵文字キーボードが有効になっていることを確認してください。
これはiOS 13のバグのようです。回避策(デバイスの場合、シミュレータには影響しません)は、textInputContextIdentifier
プロパティをオーバーライドして、nil以外の値を返すことです。
//
// 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
}
}
blld の回答に感謝します。
私は、日本語と英語のバイリンガルアプリを持っているので、iOS 13のレーダーを提出しました。一部のフィールドは日本語と一部の英語なので、20回前後に反転させるのではなく、ユーザーに適切なキーボードタイプを提示することは当然のことです。
これには回避策があり、UIKitが 'textInputMode'を呼び出した後、メインスレッドでこれを行うことができました。
// has to be done after the textInputMode method is called
if #available(iOS 13, *) {
textField.keyboardType = textField.keyboardType
}
これにより、必要なtextInputModeで応答した後、キーボードが強制的にリロードされます。私は彼らにバグと正しい振る舞いを得るための回避策を通知しました。
そのため、iOS 13.1ではバグは修正されませんでしたが、回避策が妨げられました。
いいね。バグは報告しません。回避策を見つけたら、それを使用します。
だから彼らは今この機能を黙って無効にしているようです。そしてそれは機能であり、これは文字通り、このメソッド呼び出しの目的であり、ユーザーに提示する必要のある入力モードを見つけ出します。
それはまだ動作しますただし、別の言語があり、英語を選択したい場合。
したがって、ユーザーがキーボードの選択として日本語を設定した場合、英語のキーボードを強制的に上げることができます。逆ではありません。日本語入力モードを取得しようとすると、英語のキーボードになってしまいます。
編集:
これを回避できる別の方法がありますが、簡単ではない内部APIの検出と使用が含まれます。基本的に、地球儀ボタンを押した結果を管理するために使用される関数を見つける必要があります。これを行うと、ユーザーのタップを本質的にシミュレートしていて、さまざまな効果があります。つまり、キーボードは他のアプリでも変更されます。したがって、これはお勧めできません。100%App Storeの送信に失敗します。私の最後の回避策の結果のため、私はそれを投稿したくありません。
Appleは簡単に理解できないと思います。私が知っているのは、
そのため、将来の回避策は、彼らの意図が明確になるまで、および/またはこのバグを修正するまで保留されるべきです(これは彼らがすべきことです)。変更を公開せずにAPIの一部を単に取り消すことは大きなバグです。
カスタムを保存する場所をiOSが認識できるように、textFieldにtextinputcontextidentifier
を設定する必要がありますtextInputMode
ドキュメントには書かれていませんが、動作します。
ref: https://developer.Apple.com/documentation/uikit/uiresponder/1621091-textinputcontextidentifier