提问人:stefanosn 提问时间:6/5/2022 更新时间:6/7/2022 访问量:75
当用户滚动到可见的 UITableViewCell 时,找到它
Find the visible UITableViewCell when user scrolls to it
问:
我正在使用以下代码在我的表格视图中查找可见单元格。每次用户滚动时,用户只能看到一个 UITableViewCell,但下面的代码返回两个可见行,因为这是用户滚动到单元格时 UITableView 的工作方式。
NSArray *visibleCells = [self.tableView indexPathsForVisibleRows];
for (NSIndexPath *cellIndexPath in visibleCells)
{
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:cellIndexPath];
if ([cell isKindOfClass:[C8SubmittedContentTableViewCell class]]) {
[submittedContentTableViewCell play];
}
}
我在以下位置运行上面的代码
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
但正如我所提到的,UITableView 返回两个可见单元格。我怎么知道其中哪一个对用户真正可见?因为如果我连续有两三个视频,我需要只开始播放用户真正可见的视频,同时停止播放前一个视频。
任何想法或帮助不胜感激!
答:
0赞
Asperi
6/5/2022
#1
这是可能的方法:
CGRect cellRect = [self.tableView rectForRowAtIndexPath:cellIndexPath];
CGRect visibleRect;
visibleRect.origin = self.tableView.contentOffset;
visibleRect.size = self.tableView.bounds.size;
BOOL isCellVisible = CGRectContainsRect(visibleRect, cellRect);
您的布局不清晰,因此可能需要,甚至可能需要手动矩形到矩形匹配(例如,如果单元格矩形总是大于表格剪辑区域,则应使用重叠百分比)。CGRectIntersectsRect
评论
0赞
stefanosn
6/5/2022
谢谢先生!这是它应该使用的方式吗,因为只对第一个细胞有效!NSArray *vsbCells = [self.tableView indexPathsForVisibleRows];for (NSIndexPath *cellIndexPath in vsbCells) {UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:cellIndexPath];if ([cell isKindOfClass:[TableViewCell class]]) {CGRect cellRect = [self.tableView rectForRowAtIndexPath:cellIndexPath];CGRect vsbRect;visibleRect.origin = self.tableView.contentOffset;vsbRect.size = self.tableView.bounds.size;BOOL isCellVisible = CGRectContainsRect(vsbRect, cellRect);if(isCellVisible){[TableViewCell play];} }}
0赞
stefanosn
6/5/2022
实际上,我尝试了CGRectIntersectsRect和CGRectContainsRect。CGRectContainsRect 第一次返回 1,然后对于其他单元格始终返回 0。另一方面,CGRectIntersectsRect 始终返回 1...
0赞
stefanosn
6/5/2022
Used NSLog to print the vaues of CGRect cellRect and CGRect visibleRect for the two first cells. I get: cellcgrect: {{0, 0}, {375, 545}} - visiblecellrect: {{0, 0}, {375, 667}} cellcgrect: {{0, 545}, {375, 545}} - visiblecellrect: {{0, 0}, {375, 667}} cellcgrect: {{0, 0}, {375, 545}} - visiblecellrect: {{0, 103}, {375, 667}} cellcgrect: {{0, 545}, {375, 545}} - visiblecellrect: {{0, 103}, {375, 667}} based on your answer.
0赞
stefanosn
6/5/2022
甚至更好的结果。应用程序加载并显示第一个单元格。结果为: cellcgrect: {{0, 0}, {375, 545}} - visiblecellrect: {{0, 0}, {375, 667}} - isCellVisible:1 - cellIndexPath.row:0 cellcgrect:{{0, 545}, {375, 545}} - visiblecellrect:{{0, 0}, {375, 667}} - isCellVisible:0 - cellIndexPath.row:1 现在用户滚动到第二个单元格。结果是 cellcgrect: {{0, 0}, {375, 545}} - visiblecellrect: {{0, 134}, {375, 667}} - isCellVisible:0 - cellIndexPath.row:0 cellcgrect:{{0, 545}, {375, 545}} - visiblecellrect:{{0, 134}, {375, 667}} - isCellVisible:0 - cellIndexPath.row:1 ...想法?
0赞
Cy-4AH
6/7/2022
#2
Use delegate's for starting video playing and for stopping.willDisplayCell
didEndDisplayingCell
评论