iOS UITableView 在设置 TableHeaderView 后以编程方式覆盖自动布局约束
Posted
技术标签:
【中文标题】iOS UITableView 在设置 TableHeaderView 后以编程方式覆盖自动布局约束【英文标题】:iOS UITableView override autolayout constraints programatically after setTableHeaderView 【发布时间】:2013-04-21 10:37:16 【问题描述】:好吧,这就是我的困境。
我有一个带有 UITableView (tableView) 和 UIView (viewForTableHeader) 的故事板,其中包含几个其他对象,例如 UIImag、标签等。
我以编程方式将 UIView 设置为 UITableView 的标题:
[self.tableView setTableHeaderView:self.viewForTableHeader];
这在不使用自动布局时非常有效。
但是使用自动布局,应用程序崩溃并给我留下:
由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“执行 -layoutSubviews 后仍需要自动布局。 UITableView的-layoutSubviews的实现需要调用super。'
所以在 viewDidLoad 中,我尝试将viewForTableHeader
的约束设置为:
NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:self.viewForTableHeader attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.tableView attribute:NSLayoutAttributeTop multiplier:0 constant:0];
[self.view addConstraint:constraint];
constraint = [NSLayoutConstraint constraintWithItem:self.viewForTableHeader attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.tableView attribute:NSLayoutAttributeLeft multiplier:0 constant:0];
[self.view addConstraint:constraint];
我也试过了:
- (void)layoutSublayersOfLayer:(CALayer *)layer
[super layoutSublayersOfLayer:self.tableView.layer];
并做了同样的事情试图在这里设置约束
在 nib 文件中包含 viewForTableHeader
是否更好?
我在这方面确实有点菜鸟,所以任何帮助或指示都会有所帮助。
【问题讨论】:
【参考方案1】:由于您在 IB 中同时拥有(tableView 和 headerView),您可以拖动 viewForTableHeader 到(上方)tableView 并将其设置为表头。
这将使 headerView 出现在 视图层次结构中的 tableView 下方。
如果您这样做,您将能够稍后在运行时将此视图删除/添加到表中,而不会出现自动布局错误或额外的约束。
[self.viewForTableHeader removeFromSuperview];
以后
[self.tableView setTableHeaderView:self.viewForTableHeader];
【讨论】:
哦,听起来很简单 :) 所以我照你说的做了,并将 viewForTableHeader 拖到 tableView 上,是的,这就是我所要做的。 sigh 我真的在这件事上劳累过度了。非常感谢 Mariam N!以上是关于iOS UITableView 在设置 TableHeaderView 后以编程方式覆盖自动布局约束的主要内容,如果未能解决你的问题,请参考以下文章
iOS 7 中 UITableView 的 contentInset 规则?
UITableView tableHeaderView 高度计算