12

tableHeaderViewに検索バーを持つテーブルビューをプログラムで作成しようとしています。何らかの理由で、検索バーが最初のセルの上に表示されます。

石積みを使用して制約を作成しています。

誰かが私が間違っていることを指摘できますか。

- (void)setupViews {

...
    self.tableView = [[UITableView alloc] initWithFrame:CGRectZero];
    [self.view addSubview:self.tableView];

    self.searchBar = [[UISearchBar alloc] initWithFrame:CGRectZero];
    self.tableView.tableHeaderView = self.searchBar;
...
}

- (void)updateViewConstraints {

    [self.searchBar mas_updateConstraints:^(MASConstraintMaker *make) {
        make.width.equalTo(self.view);
        make.height.equalTo(@(44));
    }];

    [self.tableView mas_updateConstraints:^(MASConstraintMaker *make) {
        make.self.top.equalTo(self.view);
        make.self.bottom.equalTo(self.toolbar.mas_top);
        make.width.equalTo(self.view);
    }];
...
}

問題

ここで、ヘッダーがセルと同じレベルにあることがわかります。 階層を表示

4

4 に答える 4

11

ご協力いただきありがとうございます。GitHub で、AutoLayout を使用して tableViewHeader のサイズを変更することについて説明している要旨を見つけました。

https://gist.github.com/andreacremaschi/833829c80367d751cb83

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

    [headerView setNeedsLayout];
    [headerView layoutIfNeeded];
    CGFloat height = [headerView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;

    headerView.frame = ({
        CGRect headerFrame = headerView.frame;
        headerFrame.size.height = height;
        headerFrame;
    });

    self.tableHeaderView = headerView;
}

updateViewConstraints 中にこのメソッドを呼び出すと、機能します。

しかし、私はそれを完全には理解していません。

于 2015-03-01T08:38:55.360 に答える
0

問題は、フレームを使用してビューに手動で設定しているためだと思います。次のautolayoutコードを置き換えます。

self.tableView = [[UITableView alloc] initWithFrame:CGRectZero];
[self.view addSubview:self.tableView];

self.searchBar = [[UISearchBar alloc] initWithFrame:CGRectZero];
self.tableView.tableHeaderView = self.searchBar;

このようなもので:

self.tableView = [UITableView new];
self.tableView.translatesAutoresizingMasksIntoConstraints = NO;
[self.view addSubview:self.tableView];

self.searchBar = [UISearchBar new];
self.searchBar.translatesAutoresizingMasksIntoConstraints = NO;
self.tableView.tableHeaderView = self.searchBar;

searchBar'sフレームを制約なしで手動で設定する必要があるため、機能しない場合があります。

于 2015-02-28T14:50:06.513 に答える
0

ここでは、テーブル ビュー ヘッダーとテーブル ビュー セルの間のスペースに関する問題があります。Attribute Inspector を使用して処理できます。それを見直してください。- UITableView を選択 - 属性インスペクター -> スクロール ビュー サイズ -> コンテンツ インセットで、Top = 44 (またはナビゲーション バーの高さ) を設定します。

または、プログラムで処理できます。

  - (void)viewDidLoad {
       UIEdgeInsets inset = UIEdgeInsetsMake(20, 0, 0, 0);
       self.tableView.contentInset = inset;
   }
于 2015-02-28T14:17:58.700 に答える