强制UITableView或UICollectionView在屏幕上加载单元格

时间:2014-07-18 14:30:59

标签: ios objective-c uitableview uiscrollview

从问题的答案看来只是reloadData
此方法启动使tableview从tableview从numberOfSections重新加载数据到-cellForRowAtIndexPath的过程。
事实是,大多数这些方法可能在下一个runloop或CATransaction中启动 我正在尝试获取tableview的全部大小以显示所有单元格,从而避免滚动的需要 只有在加载heightForRowAtIndexPath或单元格时,tableView才知道其内容大小,因此在contentSize之后似乎无法向表视图询问其-reloadData。 似乎无效的是使其内在内容大小无效并强制自动布局,或者询问 - sizeToFit,直到它加载它不知道其大小的所有单元格。也尝试+systemLayoutSizeFittingSize:UILayoutFittingExpandedSize没有成功。

2 个答案:

答案 0 :(得分:0)

表格和集合视图的重点在于,必须一次加载所有数据,但要回收UI元素并仅加载可见的内容。这就是datasource方法的目的。

要在最后添加项目,只需更改您的数据源,以便再从numberOfRowsInSectionnumberOfItemsInSection返回一个。确保您的数据源还具有填充此数据点的内容。

然后,您可以reloadRowsAtIndexPaths:reloadItemsAtIndexPaths: reloadSections:等数据源协议的方法重新加载这些数据点,但如果它们不可见,甚至可能不需要。

另一方面,如果您有自定义UIScrollView,则您的数据源应具有单元格/子视图的高度或宽度。然后,您可以轻松计算要添加的任何新子视图的位置。

答案 1 :(得分:0)

如果您希望获得tableView的正确内容大小,则可以使用heightForRowAtIndexPath:自行计算。 例如。如果单元格的高度是静态的,即它永远不会改变,那么只需将行数增加到该高度即可。否则,如果您的单元格高度是动态的,那么您可以执行以下操作:

- (CGSize)tableViewContentSize
{
    CGFloat contentHeight = 0;
    for (int i = 0; i < numberOfSections; i++) {
        for (int k = 0; k < numberOfRows; k++) {
            NSIndexPath *indexPath = [NSIndexPath indexPathForRow:k inSection:i];
            contentHeight += [self tableView:self.tableView heightForRowAtIndexPath:indexPath];
        }
    }

    CGSize contentSize = CGSizeMake(self.tableView.frame.size.width, contentHeight);
    return contentSize;
}