我想从UITableView
找到完整的可见单元格索引。
在这里,我附上了图片。
在此图像中,数字1和数字12不完全可见,因此不应返回该单元格的索引。我只想要完全可见的细胞索引,只有2,3,4,5,6,7,8,9,10,11。
答案 0 :(得分:7)
您可以使用indexPathsForVisibleRows
获取所有可见,然后使用rectForRowAtIndexPath
获取cellRect,并检查单元格是否包含在tableview的绑定中。
NSMutableArray *arr = [[NSMutableArray alloc]init];
for (NSIndexPath *indexVisible in tableView.indexPathsForVisibleRows) {
CGRect cellRect = [tableView rectForRowAtIndexPath:indexVisible];
BOOL isVisible = CGRectContainsRect(tableView.bounds, cellRect);
if (isVisible) {
//you can also add rows if you dont want full indexPath.
//[arr addObject:[NSString stringWithFormat:@"%ld",(long)indexVisible.row]];
[arr addObject:indexVisible];
}
}
NSLog(@"%@",arr);
希望这会对你有所帮助。
答案 1 :(得分:4)
您可以在[tableView rectForRowAtIndexPath:indexPath]
的数组结果的每个单元格上使用[tableView indexPathsForVisibleRows]
,并查看它们的帧是否完全在您的视图范围内。当你在它的时候,把它作为一个类别供你将来使用。
这样的事情:
-(NSArray *)visibleIndexPathIncludingPartials:(BOOL)includePartials
{
NSArray *result = [self.tableView indexPathsForVisibleRows];
if(includePartials){
return result;
}
NSMutableArray *mutableResult = [NSMutableArray array];
for(NSIndexPath *indexPath in result){
CGRect cellRect = [self.tableView rectForRowAtIndexPath:indexPath];
if(!CGRectIsEmpty(cellRect)){
CGRect rectInTableView = [self.tableView convertRect:cellRect toView:self.tableView.superview];
if(rectInTableView.origin.y < 0.0){//Checks if it is beyond actual view bounds
continue;
}
if(self.navigationController && !self.navigationController.navigationBar.isHidden){//in case navigation bar exists and you're expanding under top bar
if(rectInTableView.origin.y < CGRectGetMaxY(self.navigationController.navigationBar.frame)){
continue;
}
}
if(CGRectGetMaxY(rectInTableView) > CGRectGetMaxY(self.tableView.superview.bounds)){
continue;
}
//If you have bottom view like toolbars, yo should weed them out just like this
} else { // If the index path is invalid, this might happen
continue;
}
[mutableResult addObject:indexPath];
}
result = mutableResult;
return result;
}
答案 2 :(得分:0)
Swift 5解决方案 转换@chintan的解决方案
将此代码段添加到willDisplay单元格或cellForRow方法
for indexVisible in tableView.indexPathsForVisibleRows ?? [] {
let cellRect = tableView.rectForRow(at: indexVisible)
let isVisible = tableView.bounds.contains(cellRect)
if isVisible {
//you can also add rows if you dont want full indexPath.
//[arr addObject:[NSString stringWithFormat:@"%ld",(long)indexVisible.row]];
print(indexVisible)
}
}