viewForHeaderInSection 自动布局 - 引脚宽度

Posted

技术标签:

【中文标题】viewForHeaderInSection 自动布局 - 引脚宽度【英文标题】:viewForHeaderInSection autolayout - pin width 【发布时间】:2015-01-09 12:01:28 【问题描述】:

我正在使用UITableView 委托方法viewForHeaderInSection 在我的UITableView 中提供节标题。

我最初创建一个这样的视图:

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

然后使用 Autolayout 添加一些子视图,然后返回 headerView

我的问题是我不想具体指定 headerView 大小。我想使用 Autolayout 将左右边缘固定到视图的宽度。这是问题所在,我在 Autolayout 代码中没有可使用的超级视图。

使用上面的代码,意味着标题视图不会在旋转时自动调整大小。旋转后必须重新加载 tableview。

有什么想法可以设置 headerView 以将其边缘固定到 tableview?

谢谢

【问题讨论】:

【参考方案1】:

根据我的测试和这个答案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;

【讨论】:

谢谢,我学到了一些东西,返回 zerorect 视图使用正确的全尺寸,所以不需要使用 tableview.bounds,但是这在旋转时不正确。您必须重新加载表格视图。我猜没有超级视图可以将边缘固定到。 是的,它似乎被视为自动布局的“边界之外”。当我过去需要这种行为时,我实际上已经将UITableViewCell 子类化并使用它而不是节标题。如果您实际使用部分,它可能只是第 0 行(零)的单元格。这样,您确实可以获得旋转支持。 这实际上不是一个坏主意。事实上,当表格滚动时,这也会阻止节标题留在屏幕上。 @Darren 这也可以通过使用分组的UITableView 来解决,但我同意使用UITableViewCell 子类通常是更好的选择。

以上是关于viewForHeaderInSection 自动布局 - 引脚宽度的主要内容,如果未能解决你的问题,请参考以下文章

viewForHeaderInSection 宽度不正确

滚动时 viewForHeaderInSection 消失

如何旋转 viewForHeaderInSection

viewForHeaderInSection 对齐错误(Swift 3)

tableView:viewForHeaderInSection: 如何准确工作以及如何动态自定义此视图

viewForHeaderInSection 绘制背景但仅当视图位于屏幕顶部时