如何知道tableView开始滚动

10
我有一个疑问:是否有办法拦截tableView的滚动并添加动作?例如,我的原型单元格背景是红色的,在单元格内向上滑动时,其背景颜色变为蓝色,而在滚动tableView时,背景颜色变回红色。
这种操作是否可行?!
谢谢。

请澄清一下,您想知道UITableView是否已经滚动?还是正在滚动? - Shamas S
我需要知道何时滚动,以便我可以添加一些操作! - Fabio Cenni
5个回答

45

我使用了两种方法来解决我的问题。第一种是使用scrollViewWillBeginDragging方法,在tableView开始滚动时更改单元格的背景颜色;第二种是使用scrollViewDidEndDragging方法,在tableView停止滚动时更改颜色。 - Fabio Cenni
1
为了检测滚动停止,最好使用scrollViewDidEndDecelerating。当用户完成拖动内容时,会调用scrollViewDidEndDragging,但此后滚动仍可能继续移动。 - redent84
好的,我会使用那个方法!非常感谢!! - Fabio Cenni

0

CellForRow 是一种检测滚动的方式,同时还可以给出下一个进入视图的单元格的 indexPath.row。如果用户滚动的距离很短,以至于新的或重复使用的单元格甚至没有配置,那么拖动将不会被检测到。然而,即使使用内置方法,例如scrollViewWillBeginDragging,也无法检测到短距离滚动。

var lastCellForRowAtIndex = 0
var isScrollingUp = false
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    isScrollingUp = indexPath.row > lastCellForRowAtIndex
    lastCellForRowAtIndex = indexPath.row
}

0
在被设置为tableView代理的ViewController中,您还可以设置scrollView的代理方法。当tableView滚动时,由于它包含一个scrollView,因此这些方法将被调用。

e.g:

extension ViewController: UIScrollViewDelegate {
    func scrollViewDidEndDecelerating(scrollView: UIScrollView) { 

    }
}

0

最好保留一个变量,例如var isBackgroundColorRed: Bool = true

当您将背景颜色设置为蓝色时,另一个变量用于滚动y位置。例如:

var blueBackgroundColorYOffset: CGFloat?

当你将背景颜色设置为蓝色时,将y偏移量设置为contentView.origin.y。
然后在表格视图的委托方法中(该方法是UIScrollView的子类)执行。
func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if !isBackgroundColorRed {
        // apply some color blending between blue and red based on 
        // the amount of movement on y axis, until you reach the limit
        // its also important to take the absolute value of the blueBackgroundColorYOffset
        // and the offset here in scrollViewDidScroll to cover up or down movements
        // say 1 cell's height, then set your isBackgroundColorRed to true
    }
}

尝试将此内容添加到您的项目中,并更新您的桥接头文件。 UIColor-CrossFade

这种技术将为您提供良好的用户体验,而不是突然的背景变化。


-3

cellForRowAtIndexPath 方法在你滚动 tableView 时会被重复调用,除非你的行数非常少。


2
cellForRowAtIndexPath仅在tableview没有该单元格时才会被调用。 tableView决定何时保留单元格,因此无法保证在滚动期间将调用cellForRowAtIndexPath。 - fishinear
1
我非常确定我的答案,它将被称为tableView deques the cell或者创建一个新的cell。在你给负评之前应该先尝试一下。 - Rohit Kumar
当一个新的单元格滚动到视图中时,它被调用。它最初也被调用,并且在其他情况下,当单元格进入视图时可能会被调用。这意味着不能保证在滚动时它将被调用(正如您自己已经说明的那样)。也不能保证当它被调用时,您实际上正在滚动。因此,这不是对OP问题的答案。 - fishinear
1
无论是新单元格还是旧单元格,只需在那里放置一个日志,有10-20行,然后滚动...如果该方法未被调用,我将停止在此处回答。 - Rohit Kumar
2
叹息。在发布答案之前,您应该考虑自己是否真正回答了OP的问题:这可以可靠地用于检测tableView何时正在滚动吗?对此的回答是:不行(正如您自己已经承认的那样)。 - fishinear
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接