【问题标题】:Adding constraint to a UITableVIew headerview向 UITableVIew headerview 添加约束
【发布时间】:2013-09-21 08:02:25
【问题描述】:

所以我是新手。

我有一个包含多个视图作为兄弟的 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 元素,但我想避免这种情况。

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: iphone ios objective-c constraints nib


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢。我在模拟器上试过这个,它只适用于 4" iPhone 模拟器,不适用于 3.5"。我在原始帖子中添加了另外两个屏幕截图。我希望看到红色一直到 tableView 的顶部。
    • 刚刚也遇到了这个。将 translatesAutoresizingMaskIntoConstraints = NO 的视图添加到 UITextView 会导致类似的崩溃。
    • @newDeveloper,这一定是 iOS 7 的问题,因为它在 iOS6 上完美运行。如果我找到解决办法,我会写在这里。
    【解决方案2】:

    我遇到了同样的问题,我无法在 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 / Xcode 5.0.2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-17
      • 1970-01-01
      • 1970-01-01
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多