【发布时间】:2014-01-27 15:24:12
【问题描述】:
假设我有一个如下所示的项目:
有两个UIViews - 一个叫yellowBox,另一个叫redBox。自动布局约束规定yellowBox 距离父视图顶部 60 点,前后有 350 点空格(即视图的左侧和右侧)。 redBox 具有相同的前导和尾随空格约束。两个 0 框之间存在垂直空间约束,表示yellowBox 的底部应始终直接位于redBox 的顶部。
当用户点击展开黄色框按钮时,我希望yellowBox 的高度增加,因此redBox 向下移动以继续满足垂直空间限制(即yellowBox始终位于redBox) 之上。这是动画代码:
- (IBAction)expandYellowBox:(id)sender {
[UIView animateWithDuration:0.5
animations:^{
CGRect newFrame = self.yellowBox.frame;
newFrame.size.height += 50;
self.yellowBox.frame = newFrame;
}];
}
但是,我无法让它正常工作。从红色图标可以看出,此时的约束有问题:
这很公平,因为自动布局无法知道框的高度。但是,我不知道如何以允许调整框大小和移动框的方式解决此问题。例如,如果我在 yellowBox 上指定高度约束,那么这将阻止它被调整大小。如果我将高度约束设置为大于或等于(以允许yellowBox 高度增加),那么我会得到一个不同的约束错误:
所有约束均已在情节提要中使用 Xcode 建立 - 没有一个是用代码编写的。
非常感谢任何帮助。
编辑: 事实证明,单击按钮时yellowBox 正在增长——只是我无法分辨,因为它出现在redBox 后面。我只是在点击它大约四次后才注意到它开始出现在redBox 的底部。然而,同样的问题仍然存在——如何让redBox 始终粘在yellowBox 的底部。
【问题讨论】:
-
你能检查一下你的 viewController 中是否调用了 viewDidLayoutSubViews 方法吗?执行点击事件时。
-
不,
viewDidLayoutSubViews方法没有被调用。 -
尝试设置边界而不是框架可能会工作一段时间。甚至重复 self.yellowBox.frame = newFrame;在你的代码中两次也可能修复一些时间
-
这似乎不起作用,加上多次重复代码(直到需要)似乎不是解决问题的最佳方法......
-
检查我的答案和演示。这会有所帮助
标签: ios cocoa-touch uiview autolayout