可变高度子视图控制器作为UITableView的tableHeaderView

时间:2016-04-01 22:29:10

标签: ios uitableview uiviewcontroller uitableviewsectionheader

我正在尝试创建一个UITableViewController,它有一个UICollectionViewController作为其tableHeaderView。此集合视图的高度会有所不同,具体取决于(重新)加载的内容。

这是基本布局。 enter image description here

这就是行动:

enter image description here

截至目前,我可以通过根据单元格数计算childViewController的高度然后设置其preferredContentSize属性来调整tableHeaderView的大小。

- (void)reloadCollectionView {
    // Calculate size based on static cell height and layout
    _cellCount = arc4random_uniform(40) + 1;
    NSUInteger h = ceil(_cellCount / 2.0);

    // This informs the parent view controller of the size change
    self.preferredContentSize = CGSizeMake(self.collectionView.bounds.size.width, 20 * h);

    // Load the new number of cells
    [self.collectionView reloadData];
}

同时,在父视图控制器中,我重写此方法,然后像这样更新containerView框架:

- (void)preferredContentSizeDidChangeForChildContentContainer:(id<UIContentContainer>)container {
    [super preferredContentSizeDidChangeForChildContentContainer:container];

    // Make new CGSize to update tableHeaderView's height and reassign tableHeaderView property (required for UI refresh)
    CGSize size = [container preferredContentSize];
    _tableHeaderContainerView.frame = CGRectMake(0, 0, self.view.bounds.size.width, size.height);
    self.tableView.tableHeaderView = _tableHeaderContainerView;
}

这很有效,但这很臭。我想自动布局为我处理这个,但我无法弄清楚如何/在哪里让parentViewController.tableHeaderContainerView自动调整大小以适应其内容视图控制器。

我继承并重写的代码使用UIView / nib作为表头视图,但由于父视图控制器已经做了太多事情,所以这个实现很麻烦。似乎将它移动到自己的视图控制器是可行的方法,但我必须首先解决这个调整大小问题。

1 个答案:

答案 0 :(得分:0)

您可以使用KVO监视集合视图的contentSize,并在更改时为其设置preferredContentSize。