如何在UITableView

时间:2015-10-07 04:58:22

标签: ios objective-c uitableview

我想从UITableView找到完整的可见单元格索引。 在这里,我附上了图片。

enter image description here

在此图像中,数字1和数字12不完全可见,因此不应返回该单元格的索引。我只想要完全可见的细胞索引,只有2,3,4,5,6,7,8,9,10,11。

3 个答案:

答案 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)
    }
}