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 对齐错误(Swift 3)