所以我遇到了同样的问题,我想出了一个解决方案。基本上,如果您将 tableView 拉得足够远并按住它,则 ValueChanged 控件事件将在用户释放触摸之前触发。如果此时刷新数据并重新加载tableView,表格就会跳起来。
为了解决这个问题,我最终独立于 ValueChanged 事件刷新表。相反,我使用该事件以及scrollView委托方法,仅在用户放手后刷新表格。
首先,在 viewDidLoad 中设置刷新控件。
override func viewDidLoad()
{
super.viewDidLoad()
refreshControl = UIRefreshControl()
refreshControl?.addTarget(self, action: "refreshControlChanged", forControlEvents: UIControlEvents.ValueChanged)
}
ValueChanged 方法很简单。如果我们已经停止拖动(在快速向下滑动后发生这种情况),只需使用您自己的自定义方法刷新表格即可。
internal func refreshControlChanged()
{
if !tableView.dragging
{
refresh()
}
}
然后,您需要实现 didEndDragging。如果你下拉得足够远,refreshControl将会刷新,所以调用refresh。否则,您可能没有下拉得足够远,而是拖动了表格的不同部分,或者拖动得太快,以至于刷新控件 ValueChanged 事件尚未触发,并且它将刷新那里的表格。
override func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool)
{
if refreshControl?.refreshing == true
{
refresh()
}
}
就是这样。在您停止拖动表格之前,该表格不会重新加载,这避免了您注意到的抖动跳跃。我知道这已经有一年了,但我希望这可以帮助其他人在谷歌上遇到这个问题。