将iOS键盘布局更改为表情符号?

19

当一个UITextField成为第一响应者,或根据用户操作(例如点击UIButton),是否可以将键盘布局更改为表情符号?

我知道我可以将键盘布局更改为以下其中一个:

typedef enum {
    UIKeyboardTypeDefault,                // Default type for the current input method.
    UIKeyboardTypeASCIICapable,           // Displays a keyboard which can enter ASCII characters, non-ASCII keyboards remain active
    UIKeyboardTypeNumbersAndPunctuation,  // Numbers and assorted punctuation.
    UIKeyboardTypeURL,                    // A type optimized for URL entry (shows . / .com prominently).
    UIKeyboardTypeNumberPad,              // A number pad (0-9). Suitable for PIN entry.
    UIKeyboardTypePhonePad,               // A phone pad (1-9, *, 0, #, with letters under the numbers).
    UIKeyboardTypeNamePhonePad,           // A type optimized for entering a person's name or phone number.
    UIKeyboardTypeEmailAddress,           // A type optimized for multiple email address entry (shows space @ . prominently).

    UIKeyboardTypeAlphabet = UIKeyboardTypeASCIICapable, // Deprecated

} UIKeyboardType;

我想知道是否有一种方法可以使用表情符号布局来实现相同的效果?


似乎你无法看到这个链接 https://dev59.com/81nUa4cB1Zd3GeqPb5mq - Gerald Versluis
好的,这不是我想做的事情,我不想创建一个自定义键盘或在整个iOS上启用表情符号键盘,我只想让我的应用程序使用它! - ahmad
表情符號不是鍵盤佈局,而是實際的鍵盤。只有使用者可以決定她想要使用哪些鍵盤和目前正在使用哪個鍵盤。 - Jason Coco
好的,我明白了!但是我还不太确定。并不是所有的iOS设备用户都能自己找到隐藏的表情键盘!我正在制作一个聊天应用程序,希望用户能使用这个功能,但似乎只有具备使用表情符号键盘的先前知识的用户才能使用它。 - ahmad
3个回答

43

创建一个继承自UITextField的子类,如下所示:

class EmojiTextField: UITextField {

    // required for iOS 13
    override var textInputContextIdentifier: String? { "" } // return non-nil to show the Emoji keyboard ¯\_(ツ)_/¯ 

    override var textInputMode: UITextInputMode? {
        for mode in UITextInputMode.activeInputModes {
            if mode.primaryLanguage == "emoji" {
                return mode
            }
        }
        return nil
    }
}

在Interface Builder中,将此类选择为自定义类,代替UITextField。

这会导致键盘在该字段成为第一响应者时选择表情符号键盘(如果有),用户当然可以随时将键盘更改为任何其他内容,但至少它提供了你想要的初始选择。

感谢blldhttps://dev59.com/yVMH5IYBdhLWcg3w0DO9#58537544中提供的答案。


那太完美了。 - Senõr Ganso
1
喜欢当有人告诉我做不到某件事情,但是然后在 Stack Overflow 上有人展示我确实可以做到。这太完美了,正是我想要的。谢谢! - Phontaine Judd
不好意思,就我所知道的,这是不可能的。这个方法只是设置初始键盘。 - Dale
@ChrisVanBuskirk https://dev59.com/yVMH5IYBdhLWcg3w0DO9 - Ben Guild
感谢@BenGuild。我已经更新了我的iOS 13答案。 - Dale
显示剩余3条评论

7
以下简化适用于2021年的iOS 15:
class EmojiTextField: UITextField {
    override var textInputMode: UITextInputMode? {
        .activeInputModes.first(where: { $0.primaryLanguage == "emoji" })
    }
}

iOS 15似乎不需要textInputContextIdentifier,而其他答案中指出iOS 13需要。表情符号键盘可以在没有声明它的情况下打开。

可以在点击按钮时通过编程实现。 - Ravi Ojha

4

我已经设法防止用户切换键盘!

使用这个线程 iOS: How to detect keyboard change event 作为参考。

完整解决方案:

class EmojiTextField: UITextField {
    
    // required for iOS 13
    override var textInputContextIdentifier: String? { "" } // return non-nil to show the Emoji keyboard ¯\_(ツ)_/¯
    
    override var textInputMode: UITextInputMode? {
        for mode in UITextInputMode.activeInputModes {
            if mode.primaryLanguage == "emoji" {
                return mode
            }
        }
        return nil
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        commonInit()
    }
    
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        
        commonInit()
    }
    
    func commonInit() {
        NotificationCenter.default.addObserver(self,
                                               selector: #selector(inputModeDidChange),
                                               name: UITextInputMode.currentInputModeDidChangeNotification,
                                               object: nil)
    }
    
    @objc func inputModeDidChange(_ notification: Notification) {
        guard isFirstResponder else {
            return
        }
        
        DispatchQueue.main.async { [weak self] in
            self?.reloadInputViews()
        }
    }
}

2
不幸的是,这也禁用了表情符号搜索。 - mathlete

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接