使用AutoLayout并确保父视图的边界在调整大小时适合子视图

时间:2013-11-26 23:24:06

标签: ios autolayout

我真的希望自己能够了解自动布局。似乎每当我阅读一些关于事物应该如何工作的抽象描述时,它才有意义,但每当我真正尝试并将其付诸实践时,它总会引起巨大的麻烦。所以,如果已经有答案,但我无法找到答案,请道歉。

问题应该相对简单。我有一个容器视图,其中包含两个子视图,这里以可怕的颜色显示以获得最大的可读性:):

enter image description here

底部(黑色)视图应保持其当前大小并保持其与红色视图之间的间距,以及它本身与黄色视图底部之间的间距。  红色视图我希望能够动态地改变它的高度,导致黑色视图相应地向上/向下移动,同时黄色视图调整大小以适合红色+黑色视图。

对于黑色视图,我已将限制添加到:

  • 将高度设置为94
  • 将前导和尾随空格固定到superview
  • 将顶部空间设置为51处的红色视图。
  • 将底部空间设置为20的黄色视图。

enter image description here

我试图理解我需要添加的看似神秘的约束条件,以便当红色视图垂直调整大小时,黑色视图保持与红色视图的当前距离并保持其大小,并且外部容器视图相应地调整大小,使其包含红色视图+黑色视图+视图之间的垂直间距。

对于红色视图,我添加了约束来将顶部,左侧和右侧间距固定到superview,但是没有运气来计算垂直约束。目前我有一个约束固定高度= 114,优先级为999,约束高度> = 114,优先级为1000,这样可以确保视图的高度始终至少为114 ...... / p>

enter image description here

当我尝试手动设置红色视图的高度时开始有趣....我在视图上添加了一个按钮,当按下按钮时,我手动设置红色视图的边界。 (红色视图的默认高度为114):

CGRect bounds = self.redView.bounds;
bounds.size.height = 300;
self.redView.bounds = bounds;

当我运行此按钮并按下按钮时,视图将从此处开始:

enter image description here

对此:

enter image description here

对我来说,这没有任何意义。为什么会导致:

  • 红色视图的Y原点在变化?特别是当需要"需要"约束告诉它从黄色视图顶部停留20pts。
  • 红色和黑色视图之间的间距下降,即使它们之间的间距约束是"需要"?
  • 黄色视图的垂直尺寸不变。再说一遍,尽管红色和黑色之间存在间距,而且我已经尝试了几乎所有组合,我可以想到在抗压性和内容拥抱优先级方面......

我真的很想理解这一点,所以如果有人能够解释需要对常数进行哪些额外的限制/更改,更重要的是为什么需要它们,这将是非常感激的,因为对我而言它似乎并不清楚布局系统如何提出答案......

任何澄清都非常赞赏。

提前致谢

(上面的所有代码都在iOS 7上运行,并使用Xcode 5.0.2构建)。

1 个答案:

答案 0 :(得分:0)

你不需要任何花哨的约束来做你想要的事情 - 没有不平等或搞乱优先事项。除了对边的约束外,红色视图应该有20到顶部,51到黑色视图,高度约束为114.黑色视图,底部为20,高度为94.超视图(黄色)应该对顶部,左侧和右侧没有任何限制 - 没有高度。你应该有一个IBOutlet到红色视图的高度约束。如果要更改其高度,请修改其约束(不要设置框架):

- (IBAction)resizeYellowView:(id)sender {
    self.heightCon.constant = 300;
}

所有东西都是从黄色视图的顶部到底部用固定值链接在一起,因此当红色视图的高度发生变化时,唯一可以改变的是黄色视图的高度。