如何在初始化过程中尽早获取子视图帧

我正在改变一些代码从XIB到故事板。 设置故事板场景的子视图的帧边界的时间似乎存在实质性差异。

这个代码经常使用的技术是这样的:

  • UIView子视图在XIB或Storyboard文件中定义了维度(允许程序员以外的其他人修改UI)
  • UIViewController有一个指向IBObject UIView *对象的IBObject UIView *
  • 在UIViewController的- viewWillAppear() ,进行了一些计算,并根据这些计算完成绘图。

例如,在我们的XIB或Storyboard文件中,有一个我们希望分割成四个区域的UIView。 控制器查看该UIView的边界,查看其框架,然后在UIView中绘制四个框,每个框的四分之一大小。

在.h中:

 IBOutlet UIView *outputColorKeyView; 

在.m的viewWillAppear

 CGRect keyBounds = [outputColorKeyView bounds]; float high = keyBounds.size.height; float wide = keyBounds.size.width; float cellWidth = wide/4.0; XLog(@"Dimensions for the color key are: %f %f", high, wide); 

我的问题是,在XIB下,这工作得很好:我能够看到,我必须绘制的区域的尺寸是200点宽,例如,单元格可以绘制50点宽。

在Storyboard下面,这不再适用于我:当我从控制器的viewWillAppear方法调用时,我得到一个(0,0,0,0)的框架:

[18:09:16.901|4096] Dimensions for the color key are: 0.000000 0.000000

但是,从程序生命周期的后期运行(由一个button触发),我得到正确的结果:

[18:09:35.812|4096] Dimensions for the color key are: 36.000000 734.000000

在视图出现之前有什么方法可以获取这些信息吗? 我会这么认为,但是看起来似乎是实际呈现视图之前的最后一次机会。 还是有一些明显的开关,我错过了,这将使这项技术按预期工作?

谢谢

答案是在我的后续问题的答案中给出的…做这个东西的地方是布局完成后,在viewDidLayoutSubviews

我不清楚为什么信息从初始描述文件(无论是XIB还是Storyboard)中的数据早在viewDidLoad可用到现在是(0,0,0,0),但是它与要知道你是否在书本和networking上学习了很多教程代码。