web-dev-qa-db-ja.com

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

ソリューション

これが 完全な解決策/作業 この問題の周りです。これはBlldの answer にも賛成投票してください。これは必要な情報の重要なビットでした。

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

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

ios1 より前は、UITextInputModeprimaryLanguageで "emoji"と等しい値を返すと、デフォルトで絵文字キーボードが表示されます(下の画像を参照)。

Emoji keyboard screen shot

「絵文字」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)
17
rjstelling

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

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

8
rjstelling

私は、日本語と英語のバイリンガルアプリを持っているので、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の一部を単に取り消すことは大きなバグです。

9
dbquarrel

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

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

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

7
blld