У меня есть tableView с 4 разделами (этот tableView находится внутри View, я сделал его как всплывающее представление), и у каждого раздела есть разные строки.
В последнем разделе (4),У меня есть TextView, и когда TextView начинает редактироваться, мне нужно прокрутить tableView, потому что клавиатура покрывает TextView.
Я попытался scrollToRow в textViewDidBeginEditing, потому что именно здесь я хочу запустить прокрутку:
func textViewDidBeginEditing(_ textView: UITextView) {
let numberOfSections = tableView.numberOfSections
let numberOfRows = tableView.numberOfRows(inSection: numberOfSections-1)
let indexPathToScroll = NSIndexPath(row: numberOfRows-1, section: numberOfSections-1)
self.tableView.scrollToRow(at: indexPathToScroll as IndexPath, at: .middle, animated: false)
}
numberOfSections равно 4, numberOfRows равно 1, потому что у меня есть 1 строка в разделе 4, поэтому из-за этого я вычитаю 1 из numberOfRows и numberOfSections для создания indexPathToScroll, потому что последняя строка равна [0,3] а не [1,4].
Я пробовал scrollToRow по центру / верху / низу, и я пытался анимировать true или false, ничего не произошло, прокрутка не работает.
Anyидея почему не работает?Может быть, я не могу сделать это в textViewDidBeginEditing?
Спасибо!
Решено с помощью Центра уведомлений:
override func viewDidLoad() {
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
}
А потом:
@objc func keyboardWillShow(notification: Notification) {
if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
if self.view.frame.origin.y == 0{
self.view.frame.origin.y -= keyboardSize.height
}
}
}
@objc func keyboardWillHide(notification: Notification) {
if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
if self.view.frame.origin.y != 0 {
self.view.frame.origin.y += keyboardSize.height
}
}
}
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
if(text == "\n") {
textView.resignFirstResponder()
return false
}
return true
}