2015-01-09 23 views
5

私はUITableViewでセクションヘッダを提供するために、UITableViewデリゲートメソッドviewForHeaderInSectionを使用しています。私が最初にこのようなビューを作成viewForHeaderInSectionの自動レイアウト - ピン幅

UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, 50)]; 

が続いheaderView

を返し、その後自動レイアウトを使用して、いくつかのサブビューを追加し、私が持っている問題は、私は、具体的headerViewサイズを指定したくないです。 Autolayoutを使用して、左端に&の右端をビューの幅に固定します。ここに問題がある、私はAutolayoutコードで使用するスーパービューがありません。上記のコードを使用し

、ヘッダビューが回転にAUTORESIZEないことを意味します。回転後にテーブルビューをリロードする必要があります。

私はテーブルビューに、それのエッジを固定するheaderViewを設定することができますどのように任意のアイデア?

おかげ

私のテストから

答えて

2

、そしてこの答えhereは、UIViewは自動的にその起源が(0, 0)に設定されているそのメソッドから返され、その高さは、幅に設定-tableView: heightForHeaderInSection:、その幅から返された値に設定しますUITableView

UIViewにコントロールを追加し、initメソッドで特定のサイジングを指定せずに自動レイアウトでレイアウトすることもできました。ここで

は、ヘッダビューを作成するために私のコードです:

self.headerView = [[UIView alloc] init]; 

ここで私は、ヘッダビュー内のコントロールをレイアウトするコードがあります:ここでは

- (void)layoutControls { 
    [self.headerView addSubview:self.segmentedControl]; 
    [self.headerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(margin)-[control]-(margin)-|" 
                      options:0 
                      metrics:@{@"margin": @(self.segmentedControlLeftRightMargin)} 
                       views:@{@"control": self.segmentedControl}]]; 
    [self.headerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(margin)-[control(==height)]" 
                      options:0 
                      metrics:@{@"margin": @(self.segmentedControlTopMargin), 
                         @"height": @(self.segmentedControlHeight)} 
                       views:@{@"control": self.segmentedControl}]]; 

    [self.headerView addSubview:self.searchBar]; 
    [self.headerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(margin)-[control]-(margin)-|" 
                      options:0 
                      metrics:@{@"margin": @(self.searchBarLeftRightMargin)} 
                       views:@{@"control": self.searchBar}]]; 
    [self.headerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[control1]-(margin1)-[control2]-(margin2)-|" 
                      options:0 
                      metrics:@{@"margin1": @(self.segmentedControlBottomMargin), 
                         @"margin2": @(self.searchBarBottomMargin)} 
                       views:@{@"control1": self.segmentedControl, 
                         @"control2": self.searchBar}]]; 

} 

UITableViewDelgate議定書のためのメソッドです。

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { 
    // The hard-coded values are accurate for my controls, but you might need more advanced logic 
    return 44.0f + self.segmentedControlBottomMargin + 44.0f + self.searchBarBottomMargin; 
} 
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 
    return self.headerView; 
} 
+0

ありがとう、私は何かを学んだ、したがって、tableview.boundsを使用する必要はありませんが、これは回転時には正しくありません。あなたはテーブルビューをリロードする必要があります。私はエッジを固定するスーパービューはないと推測しています。 – Darren

+0

ええ、それは、自動レイアウトの「境界の外側」で扱われるようです。過去にこの振る舞いが必要になったとき、私は実際に 'UITableViewCell'をサブクラス化し、セクションヘッダの代わりにそれを使用しました。実際にセクションを使用している場合は、行0(ゼロ)のセルになります。そうすれば、あなたは回転支援を受けることができます**。 – mbm29414

+0

これは実際には悪い考えではありません。実際には、テーブルのスクロール時にセクションヘッダーが画面上に止まることもあります。 – Darren

関連する問題