19

Is it possible to change the keyboard layout to emoji when a UITextField becomes the first responder ? or according to a user action like tapping a UIButton

I know that i can change the keyboard layout to one of these:

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;

I am wondering if there's a way to do the same with the emoji layout?

pkamb
  • 33,281
  • 23
  • 160
  • 191
ahmad
  • 1,212
  • 1
  • 14
  • 28
  • Seems like you can't see this link http://stackoverflow.com/questions/6824381/emoji-international-keyboard – Gerald Versluis Jul 08 '12 at 11:31
  • well this not what i'm trying to do, i don't want to create a custom keyboard or enable the emoji keyboard all over iOS i just want my app to use it ! – ahmad Jul 08 '12 at 11:49
  • Emoji is not a keyboard layout, it's an actual keyboard. Only the user can decide which keyboards she wants to use period and which keyboard she is using currently. – Jason Coco Jul 09 '12 at 06:39
  • mmm ok got it ! but i'm not convinced . not all iOS devices users are able to figure out on their own that there's actually a hidden keyboard for emoticons ! I'm making a chat app and i want the user to be able to use this feature and it seems that only users with previous knowledge on the emoji keyboard can make use of it – ahmad Jul 09 '12 at 11:10

3 Answers3

43

Create a subclass of UITextField like this:

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
    }
}

In Interface Builder select this class as the Custom Class in place of UITextField.

This causes the keyboard to select emoji keyboard, if available, when the field becomes first responder. The user can, of course, change the keyboard back to anything else at any time, but at least it gives an initial selection of what you want.

Thanks to blld for his answer here https://stackoverflow.com/a/58537544/1852207.

pkamb
  • 33,281
  • 23
  • 160
  • 191
Dale
  • 3,193
  • 24
  • 29
7

The following simplification works in iOS 15 in 2021:

class EmojiTextField: UITextField {
    override var textInputMode: UITextInputMode? {
        .activeInputModes.first(where: { $0.primaryLanguage == "emoji" })
    }
}

iOS 15 does not seem to require textInputContextIdentifier, as iOS 13 was indicated to need in other answers. The emoji keyboard opens without that declared.

pkamb
  • 33,281
  • 23
  • 160
  • 191
4

I have managed a way to prevent user from switching keyboards!

Used this thread iOS: How to detect keyboard change event as an ingredient.

Full solution:

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()
        }
    }
}
pkamb
  • 33,281
  • 23
  • 160
  • 191
talsharonts
  • 267
  • 1
  • 9