当所述行靠近表视图的底部时,ScrollToRow不起作用

时间:2017-11-21 10:14:09

标签: ios swift uitableview scroll indexpath

我有一个实现文本字段委托的单元格类。在这个委托中,我调用一个函数来告诉tableview根据indexPath滚动到特定的行。这在大多数情况下都适用,但在行位于表视图的底部时则不行。 cell类有一个table属性,在我的主控制器cellForRow方法中传入。代码如下:

extension IR_TextCell: UITextFieldDelegate {

    func textFieldDidBeginEditing(_ textField: UITextField) {
        util_textField.addHightlightedBorder(textField)
        if let index = table?.indexPath(for: self)
        {
            scrollDelegate?.scrollToMe(at: index)
        }
    }
}

func scrollToMe(at index: IndexPath) {
    self.tableV.scrollToRow(at: index, at: .middle, animated: false)
}

我尝试在此处包装DispatchQueue.main.async并添加截止日期,但它没有什么区别。

我是否需要更改我的tableview的底部约束?

1 个答案:

答案 0 :(得分:0)

我的情况与您的情况略有不同,但在滚动到底部附近的单元格时遇到了同样的问题。现在,它可能适合您的实际情况,但我希望这对遇到此帖子的人有所帮助。我怀疑这可能是时间安排问题,所以我最终如下所示:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if indexPath.row == tableView.indexPathsForVisibleRows?.last?.row {

        let scrollIndex = 0//set to your predetermined scrolled to index
        let cellRect = tableView.rectForRow(at: indexPath)
        let completelyVisible = tableView.bounds.contains(cellRect)

        if scrollIndex >= indexPath.row && !completelyVisible {
            let maxIndex = 10//number of elements in the array - 1
            //in case you want a delay
            DispatchQueue.main.asyncAfter(deadline: .now() + 0)  {
                self.tableView.scrollToRow(at: IndexPath(row: scrollIndex > maxIndex ? maxIndex : scrollIndex, section: 0), at: .middle, animated: false)
            }
        }

    }
}