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

时间:2018-05-19 13:16:48

标签: swift uitableview uiscrollview uitextfield swift4

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

当我使用scrollRectToVisible(...) animated调用false时,一切都按预期工作,但当animated设置为true时,表格仅滚动单元格远,textField的底部正好在键盘上方(见左图)。然而,bottonInsets应该是正确的,因为我可以手动滚动单元格的最后一位,单元格如何正确(参见右图)

我认为在键盘上方滚动textField的下边缘的表格视图是表格视图的默认行为,但我恐怕我不知道为什么它在我想要它动画时会覆盖我自己的滚动。 / p>

左图:
textFields键盘正上方的底边(我保留了边框样式,以便您可以更好地看到它)。

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

enter image description here

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)
}

2 个答案:

答案 0 :(得分:0)

在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.

答案 1 :(得分:0)

我可以解决问题。

在调用scrollRectToVisible(...)时似乎依赖于行为。在scrollRectToVisible(...)中调用keyboardDidShow(...)时,我在问题中描述的行为就会出现。

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