6

我的示例 Storyboard 中的此文档大纲显示了我正在使用的内容。

文件大纲

我有一个自定义容器视图控制器和两个通过嵌入 segues 连接的内容视图控制器。

这是故事板本身。

故事板摘要

ZetaViewController 必须创建一些程序化视图(当然是在 ZetaView 中)。我注意到当我将这些以编程方式创建的视图居中时,它们似乎真的偏离了中心。

ZetViewController 通过检查self.view.bounds.size.heightself.view.bounds.size.width并进行一些适当的算术来使事物居中。

当我将调试日志添加到 ZetaViewController 时,我注意到 self.view.bounds.size.heightself.view.bounds.size.width尺寸等于 ContainerView (768 x 1004) 而不是ZetaView (728 x 637)。IB 中的 Size Inspector 确认这些值。

我为 ZetaView 的 tag 属性创建了一个独特的值并记录了它。ZetaViewController.view确实是 ZetaView,因为标签值确认了它。

那么发生了什么?为什么在 Storyboard 和 Size Inspector 上以较小的尺寸清晰显示的 ZetaView 在运行时会在其属性中显示错误的值?

4

2 回答 2

7

我的问题与 Storyboard、segue 或自定义容器视图控制器与内容视图控制器无关。它与iOS 5 中引入的新Cocoa 自动布局功能有关。

我的问题来自检查视图边界大小 inviewDidLoad而不是 in viewWillLayoutSubviews。在viewDidLoad调用的时候,视图控制器的视图还没有被赋予合适的大小。当我将以编程方式居中视图的代码移动到 时viewWillLayoutSubviews,它按我的预期工作。我仍然保留视图创建代码,viewDidLoad因为viewWillLayoutSubviews在布局更改时重复调用。

另请参阅iOS 视图编程指南部分“手动调整视图的布局”

于 2012-10-22T21:58:16.160 回答
4

好的,我将指出我发现的一篇出色的帖子:(更新) http://kevindew.me/post/18579273258/where-to-progmatically-lay-out-views-in-ios-5-and

在自动布局完成其魔力之后,我在视图中添加阴影 calayers 的过程非常糟糕。viewDidLoad、viewWillLoad 等没有正确布置所有内容。

viewWillLayoutSubviews 被调用了很多次,并且状态没有完全设置。但是...在 viewDidLayoutSubviews 中,最后一切都按我的预期设置。

于 2013-02-23T00:27:19.600 回答