Обработка событий клавиатуры, когда контроллер представления имеет вид прокрутки внутри - PullRequest
2 голосов
/ 02 апреля 2020

В моем проекте есть контроллер представления, который встроен в контроллер панели вкладок. У этого контроллера представления есть кнопка, которая показывает ящик (представление слайда). Я использую эту стороннюю библиотеку для этого. Теперь я буду ссылаться на него как на контроллер панели.

enter image description here

Этот контроллер вида панели представляет собой простой контроллер вида с прокруткой внутри. Scrollview имеет вид стека внутри него. Все остальные подпредставления (зеленый и оранжевый виды) размещаются в виде стека.

Оранжевый вид имеет текстовое поле внизу. Я написал приведенный ниже код для обработки событий клавиатуры, чтобы переместить текстовое поле над клавиатурой и обратно вниз.

@objc private func didReceiveKeyboardNotification(_ notification: Notification) {
    if
        let userInfo = notification.userInfo,
        let endValue = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue,
        let duration = userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double,
        let curve = userInfo[UIResponder.keyboardAnimationCurveUserInfoKey] as? UInt {

        // Transform the keyboard's frame into our view's coordinate system
        let endRect = view.convert(endValue.cgRectValue, from: view.window)

        // Find out how much the keyboard overlaps the scroll view
        // We can do this because our scroll view's frame is already in our view's coordinate system
        let keyboardOverlap = scrollView.frame.maxY - endRect.origin.y

        // Set the scroll view's content inset to avoid the keyboard
        // Don't forget the scroll indicator too!
        scrollView.contentInset.bottom = keyboardOverlap
        scrollView.verticalScrollIndicatorInsets.bottom = keyboardOverlap

        UIView.animate(withDuration: duration, delay: 0, options: UIView.AnimationOptions(rawValue: curve), animations: {
            self.view.layoutIfNeeded()
        }, completion: nil)
    }
}

После того, как клавиатура закрыта, вид должен вернуться обратно в исходное положение. Проблема в том, что просмотр прокрутки не сбрасывается в исходное положение. Текстовое поле заканчивается ниже начальной позиции, как вы видите.

enter image description here

Я не могу понять, в чем здесь проблема.

Демонстрационный проект

Ответы [ 2 ]

2 голосов
/ 07 апреля 2020

Проблема в вашем didReceiveKeyboardNotification методе. Вы используете тот же метод для обработки показать / скрыть клавиатуру, и в обоих случаях вы делаете scrollView.contentInset.bottom = keyboardOverlap, поэтому после того, как клавиатура скроет, ваша вставка будет установлена ​​на 0. Это более правильный способ:

        if notification.name == UIResponder.keyboardWillHideNotification {
            let inset = tabBarController?.tabBar.frame.size.height as! CGFloat //Tabbar height
            scrollView.contentInset.bottom = inset
            scrollView.verticalScrollIndicatorInsets.bottom = inset
        }

        if notification.name == UIResponder.keyboardWillShowNotification {
            scrollView.contentInset.bottom = keyboardOverlap
            scrollView.verticalScrollIndicatorInsets.bottom = keyboardOverlap
        }
0 голосов
/ 03 апреля 2020

Попробуйте IQKeyboardManager . У меня была похожая проблема, и это решило ее без кода, она просто работает.

...