Я знаю, что это часто задаваемый вопрос, но я не могу заставить ни одно из опубликованных решений (например, здесь ) работать должным образом в моем случае. Прежде всего, когда я обрабатываю уведомление клавиатурыWillShow, используя
if let keyboardHeight = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.height {
tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: keyboardHeight, right: 0)
}
ничего не происходит. Это похоже на хак, но эта реализация ниже (в частности, в keyboardWillShow) работает для меня, однако странно (1) это не работает в первый раз, но работает каждый последующий раз также (2) большая белая полоса появляется выше клавиатура по какой-то причине? Я не думаю, что это имеет значение, но мой пользовательский интерфейс позволяет пользователю нажимать кнопку редактирования, чтобы они могли видеть, что можно редактировать, затем они редактируют textView, а затем нажимают «Готово». Проблема, которую я пытаюсь решить, заключается в том, что этот textView находится в нижней части tableView, поэтому клавиатура скрывает его во время редактирования.
class ScoreAndStatsViewController: UITableViewController, UITextFieldDelegate, UITextViewDelegate {
@IBOutlet weak var editButton: UIButton!
@IBOutlet weak var notesTextField: UITextView!
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(notification:)), name: UIApplication.keyboardWillShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(notification:)), name: UIApplication.keyboardWillHideNotification, object: nil)
}
@IBAction func editButtonIsPressed(_ sender: UIButton) {
if editMode == false {
notesTextField.isEditable = true
notesTextField.backgroundColor = iPhoneForeGroundColor
editButton.setTitle("Done", for: .normal)
self.editMode = true
//If edit mode is true, this means they've hit the done button so save
} else {
//save data
editButton.setTitle("Edit", for: .normal)
notesTextField.isEditable = false
notesTextField.backgroundColor = UIColor.clear
self.editMode = false
}
}
// MARK: Keyboard Notifications
@objc func keyboardWillShow(notification: NSNotification) {
let pointInTable:CGPoint = notesTextField.superview!.convert(notesTextField.frame.origin, to: tableView)
var contentOffset:CGPoint = tableView.contentOffset
contentOffset.y = pointInTable.y
if let accessoryView = tableView.inputAccessoryView {
contentOffset.y -= accessoryView.frame.size.height
}
tableView.contentOffset = contentOffset
}
@objc func keyboardWillHide(notification: NSNotification) {
UIView.animate(withDuration: 0.2, animations: {
// For some reason adding inset in keyboardWillShow is animated by itself but removing is not, that's why we have to use animateWithDuration here
self.tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
})
}
}