#swift #uitableview #keyboard #uitextview
Вопрос:
Привет, в настоящее время я создаю страницу комментариев-ответов с помощью UITableView(я разместил TableView на UIViewController).
1 — Моя проблема
У меня есть пользовательский контейнерный просмотр, внутри которого есть пользовательский UITextView, и я помещаю его под ViewController.
Табличное представление перемещается вверх с помощью текстового представления, когда появляется клавиатура, и я не могу прокрутить табличное представление вниз, потому что высота «клавиатуры» была увеличена.
Поэтому я установил набор содержимого для TableView в действии keyboardWillShow и настроил его обратно.
Теперь вид подпрыгивает вверх и вниз, когда появляется клавиатура.
**1 — Что я хочу ** Я хочу, чтобы при появлении клавиатуры выполнялось действие прокрутки, но при этом можно было прокручивать до верхней части таблицы(как на странице комментариев Instagram).
Instagram вообще не прокручивается, когда он не может поднять изображение вверх.
И он расширяет обзор, когда может.
3 — Вот мои коды
class QuestionDetailViewController: UIViewController {
// MARK: - Properties
private let commentInputView = CommentInputAccessoryView()
private var tableView: UITableView!
// MARK: - LifeCycle
override func viewDidLoad() {
super.viewDidLoad()
configureTableView()
configureTableViewHeader()
setupKeyboardObservers()
}
// MARK: - Helpers
private func configureTableView() {
tableView = UITableView()
tableView.dataSource = self
tableView.delegate = self
view.addSubview(tableView)
tableView.anchor(top: view.topAnchor, left: view.leftAnchor, bottom: view.bottomAnchor, right: view.rightAnchor)
view.addSubview(commentInputView)
commentInputView.anchor(bottom: view.bottomAnchor)
commentInputView.setWidth(view.frame.width)
}
Коды, связанные с клавиатурой
extension QuestionDetailViewController {
private func setupKeyboardObservers() {
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
}
private func hideKeyboardWhenTappedAround() {
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboardAndDeselectSelectedText))
view.addGestureRecognizer(tap)
}
@objc private func keyboardWillShow(notification: Notification) {
guard let keyboardSize = (notification.userInfo? [UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else { return }
let keyboardHeight = keyboardSize.height - view.safeAreaInsets.bottom
tableView.contentInset.bottom = -keyboardHeight
tableView.scrollToBottom(animated: false)
UIView.animate(withDuration: 0, delay: 0, options: UIView.AnimationOptions.curveEaseOut, animations: {
self.view.layoutIfNeeded()
})
}
@objc private func keyboardWillHide(notification: Notification){
tableView.contentInset.bottom = 0
let animationDuration = notification.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double
}
@objc func dismissKeyboardAndDeselectSelectedText() {
commentInputView.commentTextView.resignFirstResponder()
view.endEditing(true)
}
}
Комментарии:
1. Когда вы нажимаете на TextView, вы должны освободить место для просмотра таблицы снизу(равно высоте клавиатуры).