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

Posted

技术标签:

【中文标题】可变高度子视图控制器作为 UITableView 的 tableHeaderView【英文标题】:Variable height child view controller as UITableView's tableHeaderView 【发布时间】:2016-04-01 22:29:09 【问题描述】:

我正在尝试创建一个 UITableViewController,它有一个 UICollectionViewController 作为它的 tableHeaderView。此集合视图的高度将根据(重新)加载的内容而有所不同。

这是基本布局。

它正在发挥作用:

到目前为止,我可以通过根据单元格数计算 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】:

您可以使用 KVO 来监控集合视图的 contentSize,并在它发生变化时将其设置为 preferredContentSize。

【讨论】:

以上是关于可变高度子视图控制器作为 UITableView 的 tableHeaderView的主要内容,如果未能解决你的问题,请参考以下文章

实现 UITableView (Slave) 的动态高度,它作为子视图添加到另一个具有动态高度的 UITableView (Master) 的自定义单元格中

具有动态高度的自定义视图作为 UITableView 标题 ios xcode

UITableView 静态单元格作为子视图?

UITableView 作为 inputAccessoryView 的高度为零

从 xib 添加自定义视图作为子视图时,UITableViewCell 的高度错误

UITableView 的子视图与 tableView 的高度不同