我有一个具有两个视图(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属性。

10-06 04:36