35

uiTableView のヘッダー ビューを作成しようとしています (セクション ヘッダーではなく、既に持っています)。インターフェイス ビルダーで XIB を設定しました。すべての接続が接続され、美しく動作します...テーブルが十分なスペースを与えないことを除いて! 私の問題は、テーブルの上部がテーブルのヘッダーと少し重なっているということです。

私の XIB はすべてのボタンに対して autlayout でセットアップされており、IB は制約が競合したり曖昧になったりしていないことに満足しています。ビューはフリーフォーム サイズに設定されており、私の場合は最終的に 320 x 471 になりました。次に、ビューの制約で、同じビューの固有のサイズを設定しました。

今、これは私のテーブルで完全に機能します。すべてが素晴らしく見えます。しかし、コードを使用してヘッダー ビューのフォントを手動で変更すると、レイアウトによってビューが大きくなり、テーブルの下に表示されてしまいます。

フォントとサイズを設定した後、ヘッダービューに十分なスペースを残してテーブルビューコントローラーを取得する方法はありますか? これを説明する意味があったことを願っています。

4

11 に答える 11

65

注: Swift 3 以降のバージョンは、https ://gist.github.com/marcoarment/1105553afba6b4900c10#gistcomment-1933639 にあります。


アイデアは、の助けを借りてヘッダーの高さを計算することですsystemLayoutSizeFittingSize:targetSize

ビューが保持する制約を満たすビューのサイズを返します。ビューが保持するすべての制約とそのサブビューの制約を考慮して、ビューの最適なサイズを決定します。

ヘッダーの高さを変更した後、tableHeaderViewプロパティを再割り当てして表のセルを調整する必要があります。

この回答に基づいて: UITableView で自動レイアウトを使用して、動的なセルレイアウトと可変行の高さを実現する

- (void)sizeHeaderToFit
{
    UIView *header = self.tableView.tableHeaderView;

    [header setNeedsLayout];
    [header layoutIfNeeded];

    CGFloat height = [header systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
    CGRect frame = header.frame;

    frame.size.height = height;
    header.frame = frame;

    self.tableView.tableHeaderView = header;
}
于 2014-01-13T19:13:29.647 に答える
15

インターフェイスビルダーを使用して自動レイアウトで定義したカスタムビューにテーブルビューヘッダーを設定しようとしたときに、同様の問題が発生しました。

私がそうすると、セクション ヘッダーによって不明瞭になることがわかりました。

私の回避策は、「ダミー ビュー」をテーブル ヘッダー ビューとして使用し、カスタム ビューをそのダミー ビューにサブビューとして追加することでした。これにより、自動レイアウトで制約とそれを含むビューのフレームに従って外観を構成できると思います。これはおそらく vokilam のソリューションほどエレガントではありませんが、私にとってはうまくいきます。


CGRect headerFrame = CGRectMake(0, 0, yourWidth, yourHeight);
UIView *tempView = [[UIView alloc] initWithFrame:headerFrame];
[tempView setBackgroundColor:[UIColor clearColor]];
YourCustomView *customView = [[YourCustomView alloc] initWithFrame: headerFrame];
[tempView addSubview:movieHeader];
self.tableView.tableHeaderView = tempView;
于 2014-06-10T19:00:06.077 に答える
9

あなたのtableHeaderViewフォームxibは自動レイアウトで初期化されているため、カスタムの制約headerViewsuperViewは不明です。カスタムの を追加する必要がconstraintsありますheaderView

1.viewDidLLoadカスタム headerView を tableView の tableHeaderView に割り当てます

 - (void)viewDidLoad
{
    [super viewDidLoad];
    UIView *yourHeaderView = [[[NSBundle mainBundle] loadNibNamed:@"yourHeaderView" owner:nil options:nil] objectAtIndex:0];
    //important:turn off the translatesAutoresizingMaskIntoConstraints;apple documents for details
     yourHeaderView.translatesAutoresizingMaskIntoConstraints = NO;
    self.tableView.tableHeaderView = yourHeaderView;
}

2.in - (void)updateViewConstraints、カスタム headerView の必須の制約を追加します

- (void)updateViewConstraints
{
    NSDictionary *viewsDictionary = @{@"headerView":yourHeaderView};

    NSArray *constraint_V = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[headerView(121)]"
                                                                    options:0
                                                                    metrics:nil
                                                                      views:viewsDictionary];

    NSArray *constraint_H = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[headerView(320)]"
                                                                    options:0
                                                                    metrics:nil
                                                                      views:viewsDictionary];
    [self.headerView addConstraints:constraint_H];
    [self.headerView addConstraints:constraint_V];

    NSArray *constraint_POS_V = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[headerView]"
                                                                    options:0
                                                                    metrics:nil
                                                                      views:viewsDictionary];

    NSArray *constraint_POS_H = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[headerView]"
                                                                    options:0
                                                                    metrics:nil
                                                                      views:viewsDictionary];
    [self.tableView addConstraints:constraint_POS_V];
    [self.tableView addConstraints:constraint_POS_H];

    [super updateViewConstraints];
}

わかった!PS: 関連ドキュメントは次のとおりです:ビュー コントローラーのビューのサイズ変更

于 2015-01-11T07:33:17.400 に答える
8

私の問題を解決したのはこれでした:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    sizeHeaderToFit()
}

private func sizeHeaderToFit() { 
    if let headerView = tableView.tableHeaderView {

        headerView.setNeedsLayout()
        headerView.layoutIfNeeded()

        let height = headerView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height
        var newFrame = headerView.frame

        // Needed or we will stay in viewDidLayoutSubviews() forever
        if height != newFrame.size.height {
            newFrame.size.height = height
            headerView.frame = newFrame

            tableView.tableHeaderView = headerView
        }
    }
}

私はこの解決策をどこかで見つけて、魅力的に働きましたが、どこで覚えていません。

于 2016-08-24T12:22:23.290 に答える
4

vokilamの答えがうまく機能することがわかりました。これがSwiftでの彼のソリューションです。

func sizeHeaderToFit() {
    guard let header = tableView.tableHeaderView else { return }
    header.setNeedsLayout()
    header.layoutIfNeeded()
    let height = header.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height
    header.frame.size.height = height
    tableView.tableHeaderView = header
}
于 2016-01-07T18:35:21.170 に答える
0

sizeHeaderToFit@vokilam が提案したものはうまくいきませんでした。

viewDidLoadうまくいったのは、ワイヤードの高さ、テーブルビューと同じ幅の間に呼び出される@mayqiyueの修正バージョンです。

// Anchor the headerview, and set width equal to superview
NSDictionary *viewsDictionary = @{@"headerView":self.tableView.tableHeaderView,
                                  @"tableView":self.tableView};

[self.tableView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[headerView]"
                                                                       options:0
                                                                       metrics:nil
                                                                         views:viewsDictionary]];
[self.tableView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[headerView]"
                                                                       options:0
                                                                       metrics:nil
                                                                         views:viewsDictionary]];
[self.tableView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[headerView(==tableView)]"
                                                                       options:0
                                                                       metrics:nil
                                                                         views:viewsDictionary]];
[self.tableView.tableHeaderView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[headerView(121)]"
                                                                                       options:0
                                                                                       metrics:nil
                                                                                         views:viewsDictionary]];
于 2015-07-23T05:52:06.287 に答える