当键盘隐藏/显示通知时,UIScrollView与UITextView的问题

4
我在我的视图控制器中有多个textField和textView,它们都在scrollView中。我使用以下代码处理键盘的显示和隐藏:
我在viewDidLoad中添加了以下代码行:
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name:UIResponder.keyboardWillChangeFrameNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name:UIResponder.keyboardWillHideNotification, object: nil)

还有这两个功能:
@objc func keyboardWillShow(notification:NSNotification){
    guard let keyboardValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else { return }
        
    let keyboardScreenEndFrame = keyboardValue.cgRectValue
    let keyboardViewEndFrame = view.convert(keyboardScreenEndFrame, from: view.window)
    let bottom = keyboardViewEndFrame.height - view.safeAreaInsets.bottom + 16
        
    self.scrollView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: bottom , right: 0)
}
    
@objc func keyboardWillHide(notification:NSNotification){
    self.scrollView.contentInset = UIEdgeInsets.zero
}

当我开始编辑textField时,一切都正常。但是在textView上不起作用,并且滚动到活动的textView存在问题。
我该如何修复它?
2个回答

4

这个问题的原因在这里有解释,如果你想在UIScrollView中使用UITextView,那么请取消右侧菜单检视器中的Scrolling Enabled或从代码中将其设置为False

enter image description here


0

这里有一个巧妙的方法,可以在键盘弹出时滚动到嵌入在ScrollView中的TextView,而不需要禁用滚动行为。实现UITextViewDelegate的方法textViewShouldBeginEditing(_:)如下所示:

extension MyViewController: UITextViewDelegate {
    func textViewShouldBeginEditing(_ textView: UITextView) -> Bool {
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) {
            self.scrollView.scrollViewToVisible(self.targetView)
        }
        
        return true
    }
}

你还需要监听键盘出现的通知并像往常一样实现逻辑。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接