在UIViewController(iOS 7)中“堆叠”UIViews

时间:2014-03-06 21:44:16

标签: ios iphone objective-c uiview

我是一名菜鸟iOS开发者,我有一个简单的问题,我已经把头发拉了几天。

首先,我没有在XCode中使用Interface Builder,因为我被告知最好的学习方法是通过代码逐步构建所有内容。

话虽如此,我有一个自定义的UIViewController,我在其中添加子视图。我的问题是,当它们具有可变高度时,如何自动“堆叠”它们?我的意思是“堆栈”如下:

|------------------------------------|
|                                    |
|      View 1 (variable height)      |
|                                    |
|------------------------------------|
|------------------------------------|
|                                    |
|      View 2 (variable height)      |
|                                    |
|------------------------------------|
|------------------------------------|
|                                    |
|      View 3 (variable height)      |
|                                    |
|------------------------------------|

现在我正在计算每个子视图的重载“sizeToFit”函数中每个子视图的orgin / height值。有些视图包含UIWebView,我等待它们加载以计算高度。

有一种更优雅的方式可以做到这一点,不是吗?

非常感谢任何代码示例!

谢谢你的时间!

1 个答案:

答案 0 :(得分:3)

使用自动布局!

Auto Layout的功能是根据您提供的限制为您管理UI布局。例如,在上面的视图层次结构中,您希望对视图的高度具有约束,并且希望每个视图之间具有约束,最后使用视图的超级视图约束。

由于您在使用代码进行操作,因此您首先需要在每个视图上调用setTranslatesAutoresizingMaskIntoConstraints:,其值为NO。这告诉布局系统您希望使用自动布局并自己设置所有约束。

接下来,您应该为所有视图提供约束。约束有几种形式:视图与自身之间的约束(高度,宽度等);视图和对等体之间的约束 - 共享相同超视图的两个视图之间的约束;视图与其超视图之间的约束。自动布局系统不喜欢含糊不清,因此您必须提供无法解决问题的约束。对于上面的示例,您必须设置每个视图的高度,它在超视图中的位置以及一个视图与另一个视图之间的距离。

更多高级主题包括内在大小,它会告诉自动布局您的视图可能会根据其内容动态增长和缩小,而且其他人会做出相应的反应。

定义约束的最简单方法是使用可视格式。

我建议从这些开始:


关于在代码与Interface Builder中进行UI的说法。我告诉你,不要为了UI代码而学习UI代码。提出一个想法,并开始实施这个想法。从Interface Builder开始。您将慢慢了解视图如何工作,它们如何布局,约束如何工作,布局引擎如何使用约束等。使用Xcode 5,AutoLayout已成为使用的乐趣,而使用Xcode 5.1,事情甚至更好。从Interface Builder开始,您将最终获得代码,并随时了解完成任务所需的一切。

学习不应该是关于“哦,我知道如何在代码中添加视图!”;学习应该是“我知道如何解决我必须完成或克服的问题”。如果您可以使用Interface Builder工具完成所有任务,那就太棒了。使用IB无法解决问题?更好的是,现在您正在了解视图和布局的内部工作原理。

祝你好运!