tableHeaderView的自动布局

时间:2013-08-16 20:31:58

标签: iphone ios ipad uitableview ios6

我一直在尝试通过学习自动布局来改进我的布局技巧,但我偶然发现了一个我无法解决的问题。

以下是发生的事情:有一个视图控制器,其中包含UITableViewUIView。此视图位于表格视图的正下方,其高度不会延伸到整个屏幕高度(假设它占据了它的上半部分)。

使用分组样式并位于上述视图正上方的表格视图具有半透明背景,因此您可以在其下方实际查看视图的内容。但是,由于视图占据了屏幕的一半,我需要在此表视图中添加tableHeaderView(也是半透明的),以便在首次加载视图控制器时清晰可见整个背景内容。

这样的最终效果就像一个固定的tableHeaderView,当向上滚动表视图时,它会在背景上消失。

这是使用弹簧和struts以一种简单的方式完成的,但每次我尝试将标题添加到表视图时,Auto Layout都会崩溃应用程序(无论我怎么做)。

由于我正在寻找一种方法来始终将背景中的视图高度(otherView)与tableHeaderView高度相匹配,我正在使用:

[self.view addConstraint:[NSLayoutConstraints constraintWithItem:headerView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:otherView attribute:NSLayoutAttributeHeight multiplier: 1 constant:0]];

(据我所知,约束不能直接添加到表视图中,因为otherView不是它的子项)

还有:

[headerView setTranslatesAutoResizingMaskIntoConstraints:NO]

这些调用总是导致此崩溃:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Auto Layout still required after executing -layoutSubviews. UITableView's implementation of -layoutSubviews needs to call super.'

有没有办法做到这一点?是否可以使用自动布局实际将tableHeaderView高度绑定到视图上的另一个元素?

我还应该注意到,我已经远离了IB,所以这一切都完全是在代码中完成的,特别是在loadView上。

1 个答案:

答案 0 :(得分:0)

如果为NSLayoutConstraint创建一个实例变量并将其设置为:

headerViewHeightConstraint = [NSLayoutConstraint constraintWithItem:headerView
                                                          attribute:NSLayoutAttributeHeight
                                                          relatedBy:NSLayoutRelationEqual
                                                             toItem:nil
                                                          attribute:NSLayoutAttributeNotAnAttribute
                                                         multiplier:1.0f
                                                           constant:otherView.frame.size.height];

您可以通过以下方式调整大小:

headerViewHeightConstraint.constant = 1000.0f;
[headerView updateConstraintsIfNeeded];

P.S:请注意,addConstraints:addConstraint:不同。

addConstraints与约束数组或[NSLayoutConstraints constraintsWithVisualFormat:...]

一起使用

addConstraint:与单个约束结合使用,这是上面的示例。

如果您在第一行覆盖layoutSubviews:,请致电[super layoutSubviews]。这会强制视图及其子视图自行布局,以便您可以访问其框架详细信息等。