在iOS 13上默认显示系统Emoji键盘


17

这是针对此问题的完整解决方案/解决方法,也请投票Blld的答案,因为这是所需的重要信息!

辅助搜索的替代标题

  • 将Emoji键盘默认显示为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上运行此代码会将键盘设置为系统Emoji键盘,但在iOS 13上则无效。

这是一个已知的错误?有解决方法吗?

更新

  • @Navillus请求,“活动输入模式”的完整列表为;“ en-GB”,“ emoji”
  • 经过测试并确认;13.0、13.1、13.1.1、13.1.2和13.2(种子1)

有趣的是:我能够在模拟器上成功运行此代码,但无法在设备上运行。两者均适用于iOS 13。现在我很感兴趣。
Marina Aguilar

也为我在模拟器中工作。@rjstelling您的设备上的activeInputModes的完整列表是什么?您可以使用以下命令进行检查:print(UITextInputMode.activeInputModes.map({(m)->返回m.primaryLanguage ??“”})的字符串)
Navillus

@Navillus-问题及其“ en-GB”和“ emoji”的
答案

1
现在,此问题已在iOS 13.4 / Xcode 11.4
Stephen

Answers:


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%的应用商店提交都会失败。由于最后一个解决方法的结果,我不想发布它。

我认为不可能很容易理解苹果。我所知道的是:

  1. API无法正常运行
  2. 据报道,他们没有修复错误
  3. 自报告之日起,他们(有意或无意)破坏了解决方法

因此,应该future积未来的解决方法,直到其意图明确和/或他们修复了此错误(这是他们应该做的)。仅仅撤销部分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
我在显示英文十进制小数时遇到相同类型的问题。我的应用程序的语言是阿拉伯语,我希望我的文本字段显示英语十进制小数位。我通过覆盖这些var和方法完成了上述步骤。在textInputMode中,我仅返回“ en-US”模式,但仍在iOS 13中显示阿拉伯十进制填充
。– shujaat

在iOS 13.2上对我不起作用
atereshkov

我可以确认这似乎不适用于iOS 13.2 ...
Jay Lee,

@JayLee确保已启用表情符号键盘
rjstelling

7

您需要textinputcontextidentifier在textField上进行设置,以便iOS知道将自定义保存在哪里textInputMode

它不是在文档中编写的,但是可以工作。

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


2
这为我工作在iOS 13.刚回国"emoji"""textInputContextIdentifier我定制UITextField显示表情符号键盘(与合并textInputMode的问题覆盖)。感谢您提供有关隐藏文档的提示。👍–
Baza207

当应用的本地化是阿拉伯语时,当我们想为UITextField强制使用英语十进制填充时,该功能将不起作用。
shujaat
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.