5

所以我是新来的约束。

我有一个 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文件结构

编辑 1:当我有这个 self.topicHeaderView.translatesAutoresizingMaskIntoConstraints = NO;

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

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

将尝试通过打破约束来恢复

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

编辑:2 在 4" 屏幕上,它看起来不错(红色背景覆盖了整个 tableHeaderView,正如我所料) 4

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

3.5

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

4

2 回答 2

9

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

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

另请记住,在您重新分配标头之前,此更改将不适用:

tableView.tableHeaderView.frame = ...;
tableView.tableHeaderView = tableView.tableHeaderView;
于 2013-09-17T07:04:41.107 回答
4

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

然后我创建了另一个 subView 来创建约束。

// 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/ Xcode5.0.2

于 2014-01-15T15:02:59.447 回答