如何使用Swift在UITableView上实现Snap-to-cell

时间:2015-04-16 19:42:10

标签: uitableview swift scroll

我有3行,每行高度为屏幕尺寸的80%。我正在寻找的行为(并且努力在Swift中实现)是当用户开始滚动时应该“捕捉”下一个单元格。换句话说,如果超出行的中间,它应该向前滚动以显示所有单元格并停止。

这是Swift中UITableViewController中的一个简单的UITableView。

编辑/更新: 我试图创建PageController的行为,但使用ScrollView创建垂直滚动。我可以使用PageController并将导航方向设置为垂直 - 问题已解决。

2 个答案:

答案 0 :(得分:0)

如果我理解你正在尝试做什么,这就是我尝试解决问题的方法。在视图控制器中声明一个属性,该属性存储开始滚动的触摸的垂直位置。更好的是,存储有问题的滚动视图的内容偏移量(表格视图)。您可以在委托方法scrollViewWillBeginDragging(_:)中设置其值,因为这是在滚动即将开始时调用的方法。然后,在scrollViewDidScroll(_:)中,您要跟踪到目前为止滚动进展到该垂直位置的距离。当它超过单元格高度的一半时(我假设所有3个单元格具有相同的高度),则取消滚动,而是手动设置滚动视图的内容偏移量将它捕捉到最终位置。

答案 1 :(得分:0)

您可以在UITableView上使用UIScrollViewDelegate方法来完成此操作

Swift 4.2

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
    var visibleRect = CGRect()

    visibleRect.origin = tableView.contentOffset
    visibleRect.size = tableView.bounds.size
    let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY)
    guard let indexPath = tableView.indexPathForRow(at: visiblePoint) 
        else { return }
    tableView.scrollToRow(at: indexPath, at: .top, animated: true)
}

请注意,一旦TableView完成“滚动”,此代码将仅使单元格对齐

要解决此问题,我要在我停止在屏幕上拖动手指时添加时间延迟,然后它会突然响起

我通过在UITableView上使用另一个名为scrollViewWillEndDragging的UIScrollViewDelegate方法来实现这一点。

func scrollViewWillEndDragging(_ scrollView: UIScrollView,
    withVelocity velocity: CGPoint,
    targetContentOffset: UnsafeMutablePointer<CGPoint>)
{
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.8) {
        self.scrollViewDidEndDecelerating(scrollView)
    }
}

将延迟0.8更改为您想要的任何值!