Swift — TextView подталкивает TableView вверх

#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, вы должны освободить место для просмотра таблицы снизу(равно высоте клавиатуры).