表情符号键盘 SwiftUi
Emoji keyboard SwiftUi
我想制作一个表情符号文本框,可以在其中编写唯一的表情符号和更好的表情符号,以便出现表情符号键盘。表情符号键盘是标准配置。我正在用 SwiftUI 编写程序。找到这段代码,它对我有用吗?如果是这样,你如何使用它?如果没有,您需要哪一个?
谢谢!
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()
}
}
}
使用 UIViewRepresentable
将 UITextField 包装到 SwiftUI
这是一个演示。
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")
}
}
如果您想将键盘从普通键盘切换到表情符号键盘,反之亦然。您可以使用以下代码。
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)
}
}
}
我想制作一个表情符号文本框,可以在其中编写唯一的表情符号和更好的表情符号,以便出现表情符号键盘。表情符号键盘是标准配置。我正在用 SwiftUI 编写程序。找到这段代码,它对我有用吗?如果是这样,你如何使用它?如果没有,您需要哪一个?
谢谢!
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()
}
}
}
使用 UIViewRepresentable
将 UITextField 包装到 SwiftUI
这是一个演示。
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")
}
}
如果您想将键盘从普通键盘切换到表情符号键盘,反之亦然。您可以使用以下代码。
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)
}
}
}