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



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

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

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

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

斯威夫特 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)
}

请注意,此代码只会在表格视图完成"滚动"后使单元格对齐

所做的解决方法是每当我停止在屏幕上拖动手指时都会添加时间延迟,然后它会折断

我通过在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更改为您想要的任何内容!

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

最新更新