我有一个具有两个视图(greenView,redView)和一个开关的视图控制器:
我对greenView的redView顶部空间有50px的约束。这是对redView的所有约束:
我有一个开关,点击后将greenView的高度从50px切换到100px。
当我启动该应用程序时,视图将按我的意愿进行布局,但是当轻按开关时,greenView框架的高度从50变为100,redView并没有达到我的期望-就是将其移动y位置向下50像素以维持分配给它的顶部空间限制。我在redView的底部空间设置了一个不等式约束,因此不存在冲突,并且我还调用[self.redView layoutIfNeeded]
。
以下是相关代码:
- (IBAction)switchTapped {
if (theSwitch.isOn) {
greenView.frame = CGRectMake(0, 30, 320, 100);
[redView layoutIfNeeded];
} else {
greenView.frame = CGRectMake(0, 30, 320, 50);
[redView layoutIfNeeded];
}
为什么不更新redView的y位置?
我看过WWDC视频,但它们似乎提到顺便调用了layoutIfNeeded。我想念什么?
这是启动时的样子:
这是轻按开关的时间:
最佳答案
有几件事引起了问题。第一件事是自动布局应该忽略对象的框架。如果要更改某物的高度,请更改其高度约束,而不是框架高度。这是因为约束是在布局后应用的,并且会覆盖所有框架更改。另外,红色视图看起来只限于您的 super 视图“视图”而非“greenView”。至于编辑约束,您可以设置IBOutlet
,然后修改constant
对象的UILayoutConstraint
属性。