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 后以编程方式覆盖自动布局约束的主要内容,如果未能解决你的问题,请参考以下文章

如何为 UITableView 标题设置颜色文本颜色

iOS 7 中 UITableView 的 contentInset 规则?

UITableView tableHeaderView 高度计算

iOS Table View XIB 布局问题

iOS:在 Swift 中动态设置 UITableView 高度

iOS Table View Cell 自定义左滑按钮及事件(系统自带方法)