2

我正在将一些代码从 XIB 更改为情节提要。设置情节提要场景的子视图的帧边界的时间似乎存在很大差异。

此代码经常使用的技术是:

  • UIView 子视图具有在 XIB 或故事板文件中定义的尺寸(允许程序员以外的其他人修改 UI)
  • UIViewController 有一个到对象的链接作为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 点宽。

在 Storyboards 下,这不再适合我:当我从控制器的viewWillAppear方法调用时,我得到一个 (0,0,0,0) 的帧:

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

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

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

有没有办法在视图出现之前获取这些信息?我会这么认为,但viewWillAppear似乎是实际呈现视图之前的最后机会。或者是否有一些我遗漏的明显开关可以使这项技术按预期工作?

谢谢

4

1 回答 1

4

答案是在对我的后续问题的回答中给出的......做这些事情的地方是在布局完成之后,在viewDidLayoutSubviews

我不清楚为什么信息会发生变化,从最初的描述文件(无论是 XIB 还是 Storyboard)中的数据最早可用viewDidLoad到现在是 (0,0,0,0),但不同的如果您遵循书籍和网络中的大量教程代码,请注意。

于 2012-11-16T04:09:01.190 回答