Я создал UIToolbar
, который добавлен к паре UITextField
. На панели инструментов есть три кнопки - «Предыдущая», «Следующая» и «Готово». Я не кодировал Prev & Next для этого образца. doneButton
отклоняет клавиатуру.
Я посмотрел на Google, и здесь, и там, кажется, много о том, как сохранить панель инструментов видимой, но не наоборот, какое поведение я пытаюсь решить:
- Если отображается клавиатура, я хочу, чтобы панель инструментов отображалась.
- Если клавиатура не отображается, я хочу, чтобы отображалась панель инструментов (в настоящее время управление осуществляется с помощью простого bool -
alwaysHideToolbar
.
Второе текстовое поле было настроено для паролей:
secondtextField.textContentType = .password
При тестировании я заметил, что если пользователь нажимает на Опция пароли, когда клавиатура видна (для доступа к их инструментам управления паролями), клавиатура исчезает, а панель инструментов - нет. См. Два снимка экрана ниже. Я не понимаю этого, поскольку панель инструментов скрыта, если клавиатура удалена? ?
При тестировании на симуляторе я также заметил, что такое поведение происходит, если физическая клавиатура подключена. Программная клавиатура удаляется, но при переходе в другое текстовое поле, даже если клавиатура не появляется, панель инструментов появляется.
Итак, два вопроса, с которыми я бы хотел помочь:
- Как последовательно ли я держать панель инструментов видимой или невидимой, поскольку выбранный мной подход не работает?
- Если панель инструментов видна, когда клавиатуры нет, есть ли способ ее переместить? из сейфа?
Вот код. Нет зависимостей или раскадровки и т. Д. 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)
}
}