【问题标题】:UITableView visibleCells is returning wrong cells after contentOffsetUITableView visibleCells 在 contentOffset 之后返回错误的单元格
【发布时间】:2015-07-10 08:46:25
【问题描述】:

我有一个表格视图。我使用 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;

    }

【问题讨论】:

  • 自定义滚动时间?您是否尝试将 [tableView setContentOffset:CGPointMake(x,y)]; 包装在 [UIView animateWithDuration:]; 块内?
  • @Zhang 是的,我有,但是单元格垃圾使它滚动到一个单元格,但中间单元格不显示。例如,单元格 98-100 将显示,单元格 1-3 也会显示,但单元格 4-97 不会作为 UIAnimation 的滚动。

标签: ios objective-c uitableview


【解决方案1】:

UICollectionView 上对类似问题进行了一些测试后,我想我知道发生了什么。

visibleCells 在调用相应的tableView:cellForRowAtIndexPath: 委托方法后得到更新。当您直接将contentOffset 应用于UIScrollView(或其子类)时,可能会调用setNeedsDisplay 以在下一个屏幕更新中触发UITableViewUICollectionView 的更新。

所以cellForRowAtIndexPath: 不能保证立即被调用。因此,您对 visibleCells 的调用会在屏幕更新之前执行,并且不会返回您期望的单元格。

要解决您的问题,您应该致电indexPathForRowAtPoint:indexPathsForRowsInRect:

【讨论】:

  • 是的,我不久前得出了类似的结论,并使用了indexPathsForRowAtPoint:并在superview的协调系统中分配了一个点。我使用该方法获取 indexPaths。
【解决方案2】:

对于你可以使用的集合视图

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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多