将约束添加到UITableVIew标题视图

时间:2013-09-17 02:36:42

标签: iphone ios objective-c constraints nib

所以我不熟悉约束。

我有一个nib文件,其中包含多个视图作为兄弟。 ViewController的视图包含一个tableView,我还有另一个视图,它将被添加到tableHeaderView中(让我们称之为self.tableHeaderView)。

我面临的问题是我想根据某些条件调整self.tableHeaderView的大小。我已经为所有UI元素添加了约束,但无论如何,我都不能通过nib向self.tableHeaderView添加高度约束。

我尝试以编程方式更改self.tableHeaderView的框架但是当我在模拟器中运行代码时没有效果,这是有道理的,因为如果我使用自动布局,它应该忽略框架更改。

我尝试以编程方式添加高度限制但它崩溃了。

这是我要添加高度约束的代码段。

    [self.tableHeaderView addConstraint:[NSLayoutConstraint constraintWithItem:self.tableHeaderView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0f constant:107.0f]];

我得到的例外: ***断言失败 - [UITableView layoutSublayersOfLayer:],/ SourceCache / UIKit_Sim / UIKit-2903.2 / UIView.m:8536


*由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'执行-layoutSubviews后仍需要自动布局。 UITableView的-layoutSubviews实现需要调用super。'*

最糟糕的情况我将添加第二个高度的另一个兄弟视图并复制UI元素但我想避免这种情况。

Nib file structure

编辑1:当我这样做时,我得到了那个例外     self.topicHeaderView.translatesAutoresizingMaskIntoConstraints = NO;

如果我没有,我会得到这个

  

无法同时满足约束条件。       可能至少下列列表中的一个约束是您不想要的约束。试试这个:(1)看看每个约束并试着找出你不期望的东西; (2)找到添加了不需要的约束或约束的代码并修复它。 (注意:如果您看到您不理解的NSAutoresizingMaskLayoutConstraints,请参阅UIView属性的文档translatesAutoresizingMaskIntoConstraints)   (       “”       “”   )

将尝试通过违反约束来恢复

中断objc_exception_throw以在调试器中捕获它。 UIView中列出的UIVonstraintBasedLayoutDebugging类别中的方法也可能有所帮助。

编辑:2 在一个4英寸的屏幕上,它看起来很好(红色背景覆盖整个tableHeaderView,如我所料) 4" Simulator

在3.5英寸的屏幕上,红色背景(应用在笔尖上,即使我将高度设置为117.0f,也会延伸到一定的高度。表格中的UI元素会正确显示)

3.5" screen

底部的蓝线是分隔线,蓝色边框位于tableHeaderView周围。

2 个答案:

答案 0 :(得分:9)

将视图作为页眉或页脚添加到表视图时,不能在此视图上使用约束,而只能在其中使用约束。此外,视图必须位于层次结构的顶部(如您所示),如果将其作为子视图移动到另一个视图,则会产生相同的错误。

您可以通过设置更改高度的相同框架直接在代码中更改视图的高度。这很好。

另请注意,在重新分配标题之前,此更改不会适用:

tableView.tableHeaderView.frame = ...;
tableView.tableHeaderView = tableView.tableHeaderView;

答案 1 :(得分:4)

我有同样的问题,我无法在tableHeaderView上使用约束。

然后我创建了另一个子视图来创建约束。

// 1 - create a header view and a subHeaderView
UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, bounds.size.width, bounds.size.height - 64.f)];
headerView.backgroundColor = [UIColor blackColor];

tableView.tableHeaderView = headerView;

UIView *subHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, bounds.size.width, bounds.size.height - 64.f)];
[headerView addSubview:subHeaderView];

// 2 - add constrainedView to subHeaderView (E.g.)
UIView *constrainedView = [UIView new];
[constrainedView setTranslatesAutoresizingMaskIntoConstraints:NO];
[subHeaderView addSubView:constrainedView];

// 3 - addConstraints of subviews into subHeaderView (E.g.)
[subHeaderView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[constrainedView]|" options:0 metrics:metrics views:views]];
[subHeaderView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[constrainedView]|" options:0 metrics:metrics views:views]];

这适用于我的项目,iOS 7.0 / Xcode 5.0.2