iOS 13でデフォルトでシステムの絵文字キーボードを表示する


17

解決

ここで完全なソリューション/仕事は、この問題のために周り、投票BLLDのアップ喜ば答えを、これは必要な情報の重要なビットだったので、同様に!

検索に役立つ代替タイトル

  • 絵文字キーボードをUIKeyInputオブジェクトのデフォルトとして表示する(iOS 13の場合)
  • iOS 13に絵文字キーボードを表示させる
  • UITextInputMode.primaryLanguageを絵文字に設定する
  • プログラムでキーボードを絵文字に設定する

以前は返すUITextInputModeprimaryLanguage絵文字キーボードを示すには、デフォルトであろうと匹敵「絵文字」を(下の画像を参照)。

絵文字キーボードのスクリーンショット

「絵文字」を返すサンプルコード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では影響がありません。

これは既知のバグですか?回避策はありますか?

アップデート

  • @Navillusによって要求された「アクティブな入力モード」の完全なリストは次のとおりです。「en-GB」、「絵文字」
  • テストおよび確認済み。13.0、13.1、13.1.1、13.1.2および13.2(シード1)

面白いことに、このコードはシミュレータでは正常に実行できましたが、デバイスでは実行できませんでした。両方のiOS 13。今、私は興味をそそられます。
マリーナ

シミュレータでも私のために働いた。@rjstellingデバイスのactiveInputModeの完全なリストは何ですか?これで確認できます:print(UITextInputMode.activeInputModes.map({(m)-> String in return m.primaryLanguage ?? ""}))
Navillus

@Navillus-質問への回答、その「en-GB」と「絵文字」
rjstelling

1
これはiOS 13.4 / Xcode 11.4で修正されています
Stephen

回答:


9

私は、日本語と英語のバイリンガルアプリを持っているため、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を簡単に理解することは不可能だと思います。私が知っているのはそれだけです:

  1. APIが公開されたとおりに機能していない
  2. それは報告され、彼らはバグを修正しませんでした
  3. 報告した時から、彼らは(故意かどうかにかかわらず)回避策を破った

そのため、将来の回避策は、彼らの意図が明確になるまで、および/またはこのバグを修正する(これは彼らがすべきことです)まで保留されるべきです。変更を公開せずにAPIの一部を単に取り消すことは大きなバグです。


これをありがとう!これは、これをもう少し理解するのに役立ちました。彼らがあなたの回避策を意図的にブロックしたのではないかと思います。これは私にとってバグのように感じます。機能を削除したい場合は、廃止することができます。
rjstelling

「愚かさで十分に説明されていることを悪意のせいにしないでください。」
rjstelling

誰かがこれの別の回避策を見つけましたか?
shujaat

8

注意:絵文字キーボードが有効になっていることを確認してください。

これは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の回答に感謝します。


1
英語の小数点を表示するときに同じ種類の問題が発生します。アプリの言語がアラビア語であり、テキストフィールドに英語の小数点を表示したい。これらの変数とメソッドをオーバーライドして、上記の手順を実行しました。textInputModeでは、私は唯一の「EN-US」モードを返しますが、まだそれは、iOS 13のアラビア小数パッドを示し
shujaat

iOS 13.2では動作しません
atereshkov

これはiOS 13.2ではもう機能しないようです...
Jay Lee

@JayLee絵文字キーボードが有効になっていることを確認してください
-rjstelling

7

textinputcontextidentifierカスタムを保存する場所をiOSが認識できるように、textField を設定する必要がありますtextInputMode

ドキュメントには記載されていませんが、動作します。

ref:https : //developer.apple.com/documentation/uikit/uiresponder/1621091-textinputcontextidentifier


2
これはiOSの13だけが帰国に私のために働いた"emoji"""についてtextInputContextIdentifierの私のカスタムでUITextFieldショー(と組み合わせ絵文字キーボードtextInputMode問題のオーバーライド)。非表示のドキュメントのヒントをありがとう。👍
Baza207

アプリのローカライズがアラビア語の場合に、UITextFieldに英語の小数点を強制したい場合は機能しません。
shujaat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.