2

我有一个带有两个视图(greenView、redView)和一个开关的视图控制器:

在此处输入图像描述

我对 greenView 的 redView 顶部空间有 50px 的限制。以下是 redView 的所有约束:

在此处输入图像描述

我有一个开关,当点击时将 greenView 的高度从 50px 切换到 100px。

当我启动应用程序时,视图按我想要的方式布置,但是当点击开关时,greenView 框架的高度从 50 变为 100,redView 没有做我所期望的 - 这是改变它的y 位置向下 50px 以保持分配给它的顶部空间约束。我在 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。我错过了什么?

这是启动时的样子:

在此处输入图像描述

这是当开关被点击时:

在此处输入图像描述

4

2 回答 2

2

几个指针:

  1. layoutIfNeeded假设您之前调用过setNeedsLayout. 改为使用setNeedsLayout,您的应用将尽快更新布局。

  2. 设置框架通常不适用于自动布局。改为设置或更改高度约束。这是你应该在代码中做的事情,mros 对此有一个很好的建议。

  3. 我发现不等式约束通常不是最好的解决方案,因为它们经常导致布局模棱两可。相反,设置一个等式约束,但降低优先级(例如到 500)。自动布局系统将尽量遵守约束,但会优先考虑其他约束。(默认情况下,所有约束都有 1000 优先级。)

于 2013-07-18T16:42:14.450 回答
1

有几件事会导致问题。第一件事是自动布局应该忽略对象的框架。如果你想改变某物的高度,你改变它的高度约束,而不是框架高度。这是因为约束是在布局之后应用的,并且会覆盖任何框架更改。此外,红色视图看起来受制于您的超级视图“视图”而不是“绿色视图”。至于编辑约束,您可以设置IBOutlet然后修改对象的constant属性UILayoutConstraint

于 2013-07-18T16:36:06.983 回答