我有3行,每行高度为屏幕尺寸的80%。我正在寻找的行为(并且努力在Swift中实现)是当用户开始滚动时应该“捕捉”下一个单元格。换句话说,如果超出行的中间,它应该向前滚动以显示所有单元格并停止。
这是Swift中UITableViewController中的一个简单的UITableView。
编辑/更新: 我试图创建PageController的行为,但使用ScrollView创建垂直滚动。我可以使用PageController并将导航方向设置为垂直 - 问题已解决。
答案 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
更改为您想要的任何值!