UIToolbar, используемый как UITextField.inputAccessoryView, не скрывающийся, когда клавиатура исчезает / закрывается - PullRequest
0 голосов
/ 11 января 2020

Я создал UIToolbar, который добавлен к паре UITextField. На панели инструментов есть три кнопки - «Предыдущая», «Следующая» и «Готово». Я не кодировал Prev & Next для этого образца. doneButton отклоняет клавиатуру.

Я посмотрел на Google, и здесь, и там, кажется, много о том, как сохранить панель инструментов видимой, но не наоборот, какое поведение я пытаюсь решить:

  • Если отображается клавиатура, я хочу, чтобы панель инструментов отображалась.
  • Если клавиатура не отображается, я хочу, чтобы отображалась панель инструментов (в настоящее время управление осуществляется с помощью простого bool - alwaysHideToolbar.

Второе текстовое поле было настроено для паролей:

secondtextField.textContentType = .password

При тестировании я заметил, что если пользователь нажимает на Опция пароли, когда клавиатура видна (для доступа к их инструментам управления паролями), клавиатура исчезает, а панель инструментов - нет. См. Два снимка экрана ниже. Я не понимаю этого, поскольку панель инструментов скрыта, если клавиатура удалена? ?

Step 1

Step 2

При тестировании на симуляторе я также заметил, что такое поведение происходит, если физическая клавиатура подключена. Программная клавиатура удаляется, но при переходе в другое текстовое поле, даже если клавиатура не появляется, панель инструментов появляется.

Итак, два вопроса, с которыми я бы хотел помочь:

  1. Как последовательно ли я держать панель инструментов видимой или невидимой, поскольку выбранный мной подход не работает?
  2. Если панель инструментов видна, когда клавиатуры нет, есть ли способ ее переместить? из сейфа?

Вот код. Нет зависимостей или раскадровки и т. Д. c. так что вы можете просто вырезать и вставить в пустой ViewController:

import UIKit

class ViewController: UIViewController {

    var firstTextField = UITextField()
    var secondtextField = UITextField()

    var aLabel = UILabel()

    var aButton = UIButton()

    var aKeyboardToolBar = UIToolbar()
    var alwaysHideToolbar = true


    override func viewDidLoad() {
        super.viewDidLoad()

        setupToolbar()
        setupKeyboardEventListeners()

        // Add first label
        view.addSubview(aLabel)
        aLabel.backgroundColor = .yellow
        aLabel.text = "Yellow Label"

        // Layout first label
        aLabel.translatesAutoresizingMaskIntoConstraints = false
        aLabel.topAnchor.constraint(equalTo: view.topAnchor, constant: 100).isActive = true
        aLabel.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 20).isActive = true
        aLabel.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -20).isActive = true

        // Add first textfield
        view.addSubview(firstTextField)
        firstTextField.backgroundColor = .orange
        firstTextField.placeholder = "Orange TextField"
        firstTextField.inputAccessoryView = aKeyboardToolBar

        // Layout first text field
        firstTextField.translatesAutoresizingMaskIntoConstraints = false
        firstTextField.topAnchor.constraint(equalTo: view.topAnchor, constant: 150).isActive = true
        firstTextField.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 20).isActive = true
        firstTextField.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -20).isActive = true

        // Add secondTextfield - inside contentview
        view.addSubview(secondtextField)
        secondtextField.backgroundColor = .red
        secondtextField.placeholder = "Red TextField"
        secondtextField.textContentType = .password
        secondtextField.inputAccessoryView = aKeyboardToolBar

        // Layout secondtextField - inside contentview
        secondtextField.translatesAutoresizingMaskIntoConstraints = false
        secondtextField.topAnchor.constraint(equalTo: view.topAnchor, constant: 200).isActive = true
        secondtextField.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20).isActive = true
        secondtextField.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20).isActive = true

        // Add button
        view.addSubview(aButton)
        aButton.backgroundColor = .systemBlue
        aButton.setTitle("A Button", for: .normal)

        // Layout button
        aButton.translatesAutoresizingMaskIntoConstraints = false
        aButton.topAnchor.constraint(equalTo: view.bottomAnchor, constant: -100     ).isActive = true
        aButton.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20).isActive = true
        aButton.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20).isActive = true

        // Add Target to BUtton
        aButton.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)

    }



    func setupToolbar() {
        aKeyboardToolBar = UIToolbar(frame: CGRect(x: 0, y: 0, width: view.frame.size.width, height: 50))

        // add buttons to the toolbar
        let prevButton = UIBarButtonItem(title: "PREV", style: .done, target: self, action: #selector(prevButtonTapped))
        let nextButton = UIBarButtonItem(title: "NEXT", style: .done, target: self, action: #selector(nextButtonTapped))
        let doneButton = UIBarButtonItem(title: "DONE", style: .done, target: self, action: #selector(doneButtonTapped))
        let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil)

        aKeyboardToolBar.setItems([prevButton, nextButton, flexibleSpace, doneButton], animated: true)
        aKeyboardToolBar.sizeToFit()

        // initially hide the toolbar
        aKeyboardToolBar.isHidden = true
    }



    func setupKeyboardEventListeners() {
        // Listen to keyboard events
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWasShown(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWasShown(notification:)), name: UIResponder.keyboardDidShowNotification, object: nil)

        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWasHidden(notification:)), name: UIResponder.keyboardWillHideNotification, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWasHidden(notification:)), name: UIResponder.keyboardDidHideNotification, object: nil)
    }



    deinit {
        // stop listening to keyboard events
        NotificationCenter.default.removeObserver(self)
    }



    @objc func buttonTapped() {
        print("buttonTapped")
    }



    @objc func keyboardWasShown(notification: Notification) {
        aKeyboardToolBar.isHidden = false
    }



    @objc func keyboardWasHidden(notification: Notification) {
        print("keyboardWasHidden")
        if alwaysHideToolbar {
            aKeyboardToolBar.isHidden = true
        }
    }



    @objc func prevButtonTapped() {
        print("prevButtonTapped")
    }



    @objc func nextButtonTapped() {
        print("nextButtonTapped")
    }


    @objc func doneButtonTapped() {
        print("doneButtonTapped")
        view.endEditing(true)
    }


}

...