表情符号键盘 SwiftUi

Ива*_*сов 6 emoji swift

我想制作一个表情符号文本框,可以在其中编写唯一的表情符号,并且更好,以便出现表情符号键盘。表情符号键盘是标准的。我正在用 SwiftUI 编写一个程序。找到了这段代码,它对我有用吗?如果是这样,你如何使用它?如果没有,您需要哪一个?

\n

感谢!

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

Raj*_*han 15

用于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")
    }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述



如果您想将键盘从普通键盘切换到表情符号,反之亦然。您可以使用下面的代码。

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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述