我有一个带两个视图的视图控制器(greenView,redView)和一个开关:
我对来自greenView的50px的redView顶部空间有一个约束。以下是redView的所有约束:
我有一个开关,当点击时,将绿色视图的高度从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。我错过了什么?
这是推出时的样子:
这里是轻触开关的时候:
答案 0 :(得分:2)
有几点指示:
layoutIfNeeded
假设您之前曾致电setNeedsLayout
。请改用setNeedsLayout
,您的应用会尽快更新布局。
设置框架通常不适用于autolayout。改为设置或更改高度约束。这是你应该在代码中做的事情,mros对此提出了很好的建议。
我发现不等式约束通常不是最佳解决方案,因为它们经常会导致模糊布局。相反,设置相等约束,但降低优先级(例如,降低到500)。自动布局系统将尝试尽可能地遵守约束,但将优先考虑其他约束。 (默认情况下,所有约束都有1000个优先级。)
答案 1 :(得分:1)
有一些事情会导致问题。第一件事是autolayout应该忽略对象的框架。如果要更改某物的高度,请更改其高度约束,而不是帧高。这是因为在布局之后应用约束并且将覆盖任何帧更改。此外,红色视图看起来受限于您的超级视图“视图”而非“绿色视图”。在编辑约束时,您可以设置IBOutlet
,然后修改constant
对象的UILayoutConstraint
属性。