2

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に移動するのが道のようですが、最初にこのサイズ変更の問題に取り組む必要があります.

4

1 に答える 1