Swift:如何显示带有附件视图的键盘,该附件视图包含成为第一响应者的文本字段?

时间:2019-01-17 01:34:24

标签: ios swift keyboard uitextview

我正在开发一个iOS应用程序,在该应用程序中,当用户点击按钮时,将调用一个显示键盘的功能(最初没有文本视图或文本字段。最初只显示键盘)。键盘在其输入附件视图中还包含一个textview或textfield。轻按textview或textfield时,textview成为第一响应者。这与iPhone上的Messages应用程序的工作方式非常相似,不同之处在于文本字段/视图包含在同一键盘的附件视图中,并且事先不可见。我正在努力想象这是怎么可能的-任何人都可以提供帮助吗?

1 个答案:

答案 0 :(得分:1)

我不确定要完成的目标100%。此代码将在按下按钮时打开键盘,并且仅在用户开始键入时显示textField。

按下按钮时,我们将隐藏的textField的响应器设置为true。这样,我们在不显示textField的情况下打开了键盘。当用户开始键入内容时,我们将取消隐藏textField并将其约束更改为在键盘上方。

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var button: UIButton!
    @IBOutlet weak var textField: UITextField!
    @IBOutlet weak var textFieldBottomConstraint: NSLayoutConstraint!

    var keyboardHeight: CGFloat = 0

    override func viewDidLoad() {
        super.viewDidLoad()
        button.addTarget(self, action: #selector(buttonPressed), for: .touchUpInside)
        textField.isHidden = true
        textField.delegate = self

        NotificationCenter.default.addObserver(
            self,
            selector: #selector(keyboardWillShow),
            name: UIResponder.keyboardWillShowNotification,
            object: nil
        )
    }

    @objc func buttonPressed() {
        textField.becomeFirstResponder()
    }

    @objc func keyboardWillShow(_ notification: Notification) {
        if let keyboardFrame: NSValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
            let keyboardHeight = keyboardFrame.cgRectValue.height
            self.keyboardHeight = keyboardHeight
        }
    }
}

extension ViewController: UITextFieldDelegate {
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        textField.isHidden = false
        textFieldBottomConstraint.constant = keyboardHeight
        return true
    }
}