我有一个tableView。我使用CADisplayLink来调用一些滚动tableView的代码。我这样做是因为我想自定义滚动而不是使用UITableView方法所花费的时间。
我想要一些缓动,所以我在displayLink滚动上调用invalidate
然后再做一个contentOffset让它看起来不错。我向上滚动25分。然后我调用NSArray *array = self.tableView.visibleCells
但是在我失效之后我从最终滚动之前得到了单元格。例如,我的数组保持数字1-8,我从底部开始,因此在启动时tableView中存在6,7,8。我按下UIButton并滚动2.1秒。它停止,调用另一种方法并向后滚动另一个方向25点。我的tableView显示
3 4 5
但是我的NSLog语句显示
2 3 4
问题是我无法在滚动后获得正确的索引或单元格。
-(void)scrollRoller{
self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(automaticScroll:)];
[self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
}
-(void)automaticScroll:(CADisplayLink*)displayLink
{
[self.tableView setContentOffset:CGPointMake(self.tableView.contentOffset.x, self.tableView.contentOffset.y - 5) animated:NO];
double test = self.displayLink.duration *self.displayLink.frameInterval;
self.counter = self.counter + test;
if (self.counter >= 2.1){
[self.displayLink invalidate];
[self.tableView setContentOffset:CGPointMake(self.tableView.contentOffset.x, self.tableView.contentOffset.y + 25) animated:YES];
NSArray* cells = self.tableView.visibleCells;
NSLog(@"cells in first method %@", cells);
self.counter = 0.0;
}
答案 0 :(得分:2)
在对`SELECT "DwgID", SUM( CASE WHEN "Current" = 1 THEN 1 ELSE 0 END ) "Current" FROM "tblRev" GROUP BY "DwgID" HAVING ( ( SUM( CASE WHEN "Current" = 1 THEN 1 ELSE 0 END ) > 1 ) )`
的类似问题进行一些测试后,我想我已经弄明白了发生了什么。
UICollectionView
委托方法后, visibleCells
会更新。当您直接将tableView:cellForRowAtIndexPath:
应用于contentOffset
(或其子类)时,可能会调用UIScrollView
来触发setNeedsDisplay
或{{1}的更新在下一个屏幕更新中。
所以UITableView
不能立即被调用。因此,您在{1}}的通话会在屏幕更新之前执行,并且不会返回您期望的单元格。
要解决您的问题,请致电UICollectionView
或cellForRowAtIndexPath:
。
答案 1 :(得分:0)
对于集合视图,您可以使用
var visibleIndexes : [IndexPath] {
let collectionViewBounds = self.bounds // the collection view visible container
let paths = gamesCollectionView.collectionViewLayout.layoutAttributesForElements(in:collectionViewBounds)!.map { $0.indexPath }.sorted(by: <)
return paths
}