表格视图仅滚动到文本字段底部边缘

Posted

技术标签:

【中文标题】表格视图仅滚动到文本字段底部边缘【英文标题】:table views only scrolls to textfields bottom edge 【发布时间】:2018-05-19 13:16:48 【问题描述】:

我的表格视图最底部的单元格是一个带有文本字段的单元格。当用户点击它时,我想滚动它以使单元格位于键盘正上方。

当我用animated false 调用scrollRectToVisible(...) 时,一切都按预期工作,但是当animated 设置为true 时,表格只滚动单元格到目前为止,文本字段的底部是正确的键盘上方(见左图)。然而 bottonInsets 应该是正确的,因为我可以手动滚动单元格的最后一位,并且单元格位于正确的位置 (见右图)

我认为在键盘上方滚动文本字段底部边缘的表格视图是表格视图的默认行为,但恐怕我不知道为什么当我想要动画时它似乎覆盖了我自己的滚动。

左图: 键盘正上方的 textFields 底部边缘(我保留了边框样式,以便您看得更清楚)。

右图: 我多么想要它。单元格的底部边缘位于键盘正上方。

func repositionTextfieldCell(in tableView: UITableView) 
    guard let textFieldCell = tableView.bottommostCell() else  return 
    guard let keyboardRect = activeKeyboardRect else  return 

    // - Adjust insets

    var bottomInset = keyboardRect.size.height

    tableView.contentInset.bottom = bottomInset
    tableView.scrollIndicatorInsets.bottom = bottomInset

    // - Make cell visible

    let x = textFieldCell.frame.minX
    let y = textFieldCell.frame.maxY

    tableView.scrollRectToVisible(CGRect(origin: CGPoint(x: x, y: y),
                                         size: CGSize(width: 1, height: 1)), animated: true)

【问题讨论】:

【参考方案1】:

在 viewDidLoad() 中添加这个并为 tableview 底部创建一个 NSlayout 约束。

NotificationCenter.default.addObserver(
self,
selector: #selector(keyboardWillShow),
name: NSNotification.Name.UIKeyboardWillShow,
object: nil
)

创建函数

@objc func keyboardWillShow(_ notification: Notification) 
if let keyboardFrame: NSValue = notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue 
    let keyboardRectangle = keyboardFrame.cgRectValue
    let keyboardHeight = keyboardRectangle.height
    tableBottomConstraint.constant = self.view.frame.height - keyboardHeight


重复该过程以在keyboardWillHide()方法中重置tableBottomConstraint.constant = 0。

【讨论】:

我试过你的答案,但改变底部约束只是剪辑表格内容而不是滚动它:(【参考方案2】:

我可以解决问题。

行为似乎依赖于scrollRectToVisible(...) 被调用。我在问题中描述的行为发生在 scrollRectToVisible(...)keyboardDidShow(...) 中调用时。

但是,当您在keyboardWillShow(...) 中调用scrollRectToVisible(...) 并将animated 设置为false 时,单元格/矩形会被滑入的键盘向上推。我认为这看起来很棒。

【讨论】:

以上是关于表格视图仅滚动到文本字段底部边缘的主要内容,如果未能解决你的问题,请参考以下文章

滚动到顶部边缘而不是底部边缘时显示 Div

具有文本字段滚动问题的 iOS 表格视图

Kivy Scrollview 自动滚动到新文本和行消失

如何在设置了“等宽”的滚动视图中嵌入的堆栈视图中将标签文本设置为远离视图边缘?

Android:隐藏屏幕顶部边缘的视图

NSLayoutConstraint 将视图固定到父视图的底部边缘