Emoji keyboard SwiftUi
Use UIViewRepresentable
for wrapped UITextField to SwiftUI
Here is a demo.
class UIEmojiTextField: UITextField {
override func awakeFromNib() {
super.awakeFromNib()
}
func setEmoji() {
_ = self.textInputMode
}
override var textInputContextIdentifier: String? {
return ""
}
override var textInputMode: UITextInputMode? {
for mode in UITextInputMode.activeInputModes {
if mode.primaryLanguage == "emoji" {
self.keyboardType = .default // do not remove this
return mode
}
}
return nil
}
}
struct EmojiTextField: UIViewRepresentable {
@Binding var text: String
var placeholder: String = ""
func makeUIView(context: Context) -> UIEmojiTextField {
let emojiTextField = UIEmojiTextField()
emojiTextField.placeholder = placeholder
emojiTextField.text = text
emojiTextField.delegate = context.coordinator
return emojiTextField
}
func updateUIView(_ uiView: UIEmojiTextField, context: Context) {
uiView.text = text
}
func makeCoordinator() -> Coordinator {
Coordinator(parent: self)
}
class Coordinator: NSObject, UITextFieldDelegate {
var parent: EmojiTextField
init(parent: EmojiTextField) {
self.parent = parent
}
func textFieldDidChangeSelection(_ textField: UITextField) {
DispatchQueue.main.async { [weak self] in
self?.parent.text = textField.text ?? ""
}
}
}
}
struct EmojiContentView: View {
@State private var text: String = ""
var body: some View {
EmojiTextField(text: $text, placeholder: "Enter emoji")
}
}
If you want to switch the keyboard from Normal to Emoji and vice versa. You can use the below code.
class UIEmojiTextField: UITextField {
var isEmoji = false {
didSet {
setEmoji()
}
}
override func awakeFromNib() {
super.awakeFromNib()
}
private func setEmoji() {
self.reloadInputViews()
}
override var textInputContextIdentifier: String? {
return ""
}
override var textInputMode: UITextInputMode? {
for mode in UITextInputMode.activeInputModes {
if mode.primaryLanguage == "emoji" && self.isEmoji{
self.keyboardType = .default
return mode
} else if !self.isEmoji {
return mode
}
}
return nil
}
}
struct EmojiTextField: UIViewRepresentable {
@Binding var text: String
var placeholder: String = ""
@Binding var isEmoji: Bool
func makeUIView(context: Context) -> UIEmojiTextField {
let emojiTextField = UIEmojiTextField()
emojiTextField.placeholder = placeholder
emojiTextField.text = text
emojiTextField.delegate = context.coordinator
emojiTextField.isEmoji = self.isEmoji
return emojiTextField
}
func updateUIView(_ uiView: UIEmojiTextField, context: Context) {
uiView.text = text
uiView.isEmoji = isEmoji
}
func makeCoordinator() -> Coordinator {
Coordinator(parent: self)
}
class Coordinator: NSObject, UITextFieldDelegate {
var parent: EmojiTextField
init(parent: EmojiTextField) {
self.parent = parent
}
func textFieldDidChangeSelection(_ textField: UITextField) {
parent.text = textField.text ?? ""
}
}
}
struct EmojiContentView: View {
@State private var text: String = ""
@State private var isEmoji: Bool = false
var body: some View {
HStack{
EmojiTextField(text: $text, placeholder: "Enter emoji", isEmoji: $isEmoji)
Button("EMOJI") {
isEmoji.toggle()
}.background(Color.yellow)
}
}
}
Showing the system Emoji keyboard by default on iOS 13
NB: Make sure you have the Emoji keyboard enabled.
This seems to be an iOS 13 bug, the work around (for devices, this does not affect the Simulator) is to override the textInputContextIdentifier
property and return a non-nil value.
//
// 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
}
}
Thanks to blld for his answer.
Can't get Predictive Keyboard Emoji suggestions to show up in TextEditor/TextField
Emojis started to show up automatically!
Related Topics
How to Handle Hash Collisions for Dictionaries in Swift
Disable Scrolling in Swiftui List/Form
How to Increase (Animate) the Width of the Square on Both Ends
Swift: Programmatically Enumerate Outgoing Segues from a Uiviewcontroller
Controlling Size of Texteditor in Swiftui
Why Is It Legal to Mutate an Actor's Nonsendable Property
How Should You Handle Closure Arguments for Uialertaction
Expand and Contract Tableview Cell When Tapped, in Swift
Swift (iOS 8 Sdk) Convert Unmanaged<Abmultivalueref> to Abmultivalueref
How to Link to a 3Rd Party Swift Framework
Swift 2: !, ? -" Value of Optional Type "..." Not Unwrapped"
Why Does Realitykit Memory Does Not Clear After Deinit Called
Scenekit - Custom Geometry Does Not Show Up
How to Prevent Timer Slowing Down in Background
Why Is Calendar.Date(From: Datecomponents) Adding Time
In Swift, Does Int Have a Hidden Initializer That Takes a String