当视图控制器内部具有滚动视图时处理键盘事件

问题描述 投票:0回答:2

在我的项目中,有一个视图控制器嵌入在标签栏控制器中。该视图控制器具有一个显示抽屉的按钮(滑入视图)。我为此使用this第三方库。从现在开始,我将使用它作为面板视图控制器。

enter image description here

此面板视图控制器是一个简单的视图控制器,内部具有滚动视图。滚动视图中有一个堆栈视图。所有其他子视图(绿色和橙色视图)都通过堆栈视图进行布局。

橙色视图的底部有一个文本字段。我已经编写了以下代码来处理键盘事件,以将文本字段移至键盘上方并向下移动。

@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

我不知道这里出了什么问题。

Demo project

ios swift uiscrollview ios13 uikeyboard
2个回答
0
投票

尝试IQKeyboardManager。我有一个类似的问题,这个问题无需任何代码即可解决,它可以正常工作。


0
投票

didReceiveKeyboardNotification方法中的问题。您使用相同的方法来处理显示/隐藏键盘,并且在两种情况下都输入scrollView.contentInset.bottom = keyboardOverlap,因此在键盘隐藏后,您的插图将设置为0。这是更正确的方法:

© www.soinside.com 2019 - 2024. All rights reserved.