带有一个可见单元格的UITableView:确定哪个最明显

bra*_*ipt 5 objective-c uitableview ios

给定在任何给定时间具有单个可见单元格的UITableView,如何在滚动表格视图时确定哪个单元格在视图中最多

我知道通过这样做我可以获得一系列可见细胞:

NSArray *paths = [tableView indexPathsForVisibleRows];
Run Code Online (Sandbox Code Playgroud)

然后通过执行以下操作获取最后一个单元格(或第一个或其他)

UITableViewCell* cell = (UITableViewCell*)[tableView cellForRowAtIndexPath:[paths lastObject]];
Run Code Online (Sandbox Code Playgroud)

但是如何比较所有可见细胞并确定它们中哪一个最为可见?

Seb*_*ddd 5

以下逻辑将使您在滚动结束时获得最明显的单元格:

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {

    CGRect visibleRect = (CGRect){.origin = self.tableView.contentOffset, .size = self.tableView.bounds.size};
    CGPoint visiblePoint = CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMidY(visibleRect));
    NSIndexPath *visibleIndexPath = [self.tableView indexPathForRowAtPoint:visiblePoint];

}
Run Code Online (Sandbox Code Playgroud)


das*_*ght 3

根据返回的路径数量,算法会有所不同:

  • 如果只有一条路径,那就是最明显的单元格
  • 如果存在三个或更多路径,则中间的任何单元格(即除第一个和最后一个单元格之外的所有单元格)同样可见
  • 如果正好有两个单元格,则找到在其父视图*中分隔两个单元格的线的位置,并计算两个距离 - 顶部到中间和中间到底部。如果从顶部到中间较大,则顶部单元格最明显。如果中到下更大,则第二个单元格更明显。否则,两个单元格同样可见。

*中点位置是第二个单元格的底部。顶部和底部位置是表格视图的顶部和底部。