UICollectionViewController を tableHeaderView として持つ UITableViewController を作成しようとしています。このコレクション ビューは、(再) ロードされたものに応じて高さが異なります。
そして、ここでそれが実行されています:
今のところ、セルの数に基づいて 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;
}
これは機能しますが、これは臭いです。autolayout にこれを処理してもらいたいのですが、parentViewController.tableHeaderContainerView をコンテンツ ビュー コントローラーに合わせて自動的にサイズ変更する方法/場所がわかりません。
私が継承して書き直したコードは、テーブル ヘッダー ビューに UIView/nib を使用しますが、親ビュー コントローラーが既に行うことが多すぎるため、この実装は面倒です。これを独自のView Controllerに移動するのが道のようですが、最初にこのサイズ変更の問題に取り組む必要があります.