我一直在尝试通过学习自动布局来改进我的布局技巧,但我偶然发现了一个我无法解决的问题。
以下是发生的事情:有一个视图控制器,其中包含UITableView
和UIView
。此视图位于表格视图的正下方,其高度不会延伸到整个屏幕高度(假设它占据了它的上半部分)。
使用分组样式并位于上述视图正上方的表格视图具有半透明背景,因此您可以在其下方实际查看视图的内容。但是,由于视图占据了屏幕的一半,我需要在此表视图中添加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
上。
答案 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]
。这会强制视图及其子视图自行布局,以便您可以访问其框架详细信息等。