如何在兄弟视图更改大小时获取自动布局以重新定位视图?

时间:2013-07-18 16:06:57

标签: ios autolayout

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

enter image description here

我对来自greenView的50px的redView顶部空间有一个约束。以下是redView的所有约束:

enter image description here

我有一个开关,当点击时,将绿色视图的高度从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。我错过了什么?

这是推出时的样子:

enter image description here

这里是轻触开关的时候:

enter image description here

2 个答案:

答案 0 :(得分:2)

有几点指示:

  1. layoutIfNeeded假设您之前曾致电setNeedsLayout。请改用setNeedsLayout,您的应用会尽快更新布局。

  2. 设置框架通常不适用于autolayout。改为设置或更改高度约束。这是你应该在代码中做的事情,mros对此提出了很好的建议。

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

答案 1 :(得分:1)

有一些事情会导致问题。第一件事是autolayout应该忽略对象的框架。如果要更改某物的高度,请更改其高度约束,而不是帧高。这是因为在布局之后应用约束并且将覆盖任何帧更改。此外,红色视图看起来受限于您的超级视图“视图”而非“绿色视图”。在编辑约束时,您可以设置IBOutlet,然后修改constant对象的UILayoutConstraint属性。