Ios 如何在初始化过程的早期获取子视图帧

Ios 如何在初始化过程的早期获取子视图帧,ios,uistoryboard,Ios,Uistoryboard,我正在将一些代码从XIB更改为故事板。在设置情节提要场景的子视图的帧边界的时间上似乎有很大的差异 此代码经常使用的一种技术是: UIView子视图在XIB或脚本文件中定义了维度(允许程序员以外的人修改UI) UIViewController有一个指向对象的链接,作为IBObject UIView* 在UIViewController的-viewWillExample()中,会进行某些计算,并根据这些计算进行绘图 例如,在我们的XIB或故事板文件中,有一个UIView,我们希望将其分为四个区域

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

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

  • UIView子视图在XIB或脚本文件中定义了维度(允许程序员以外的人修改UI)
  • UIViewController有一个指向对象的链接,作为
    IBObject UIView*
  • 在UIViewController的
    -viewWillExample()
    中,会进行某些计算,并根据这些计算进行绘图
例如,在我们的XIB或故事板文件中,有一个UIView,我们希望将其分为四个区域。控制器查看该UIView的边界,查看其框架,然后在UIView中绘制四个框,每个框的大小为四分之一

在h中:

IBOutlet UIView *outputColorKeyView;
在.m的
视图中将出现

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);
我的问题是,在XIBs下,这很好:我能够看到我必须绘制的区域的尺寸是200点宽(例如),单元格可以绘制50点宽

在故事板下,这不再适用于我:当我从控制器的
视图调用时,我将获得一个(0,0,0,0)帧

[18:09:16.901 | 4096]颜色键的尺寸为:0.000000 0.000000

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

[18:09:35.812|4096]颜色键的尺寸为:36.000000 734.000000

有没有办法在视图出现之前获取此信息?我想是的,但是
视图将出现
似乎是视图实际呈现之前的最后一次机会。或者,是否有一些明显的开关,我错过了,这将使这项技术的工作预期


谢谢

答案是在回答我的。。。在布局完成后的
viewdilayoutsubviews


我不清楚为什么信息会发生变化,从最初描述文件中的数据(无论是XIB还是故事板)早在
viewDidLoad
时就可用到现在的数据(0,0,0,0),但是如果你在书中和网上都遵循了很多教程的代码,那你就要意识到这一点了。

答案是在我的。。。在布局完成后的
viewdilayoutsubviews


我不清楚为什么信息会发生变化,从最初描述文件中的数据(无论是XIB还是故事板)早在
viewDidLoad
时就可用到现在的数据(0,0,0,0),但是,如果你在书本和网络上遵循了很多教程代码,那就需要注意了。

那里还发生了一些其他的事情。如果
IBOutlet
正确连接,并且视图是视图控制器的
view
属性的正确子视图,那么它应该早在
viewdiload:
之前就可用,
视图将出现:
。好的,谢谢-很高兴知道。代码是从XIB版本中直接删除的,因此看起来应该是相同的工作方式-但是尺寸标注在视图中不可用的事实将在以后出现,但不可用(无需通过其他方法操纵视图)我的主要想法是,故事板中的UIView是否会有一个设置,它显然会产生这种微妙的副作用。我将尝试在一些新代码中复制该问题。好的,我从一个完全新的项目中获得相同的行为,空的故事板(这是第二个场景,通过一个按钮连接到模式转换)。空的故事板除了两个场景(这是第二个场景,通过一个按钮连接到模式转换)。第二个场景是单视图。当我在场景控制器的viewDidLoad中执行此操作时:
-(void)viewDidLoad{[super viewDidLoad];NSLog(@“------------------------------------”);NSLog(@“viewDidLoad[TestGameController]:我的视图是:%@,[self view]);NSLog(@“viewDidLoad[TestGameController]:我的子视图1是:%@”,subViewOne);)
那里正在发生其他事情。如果
IBOutlet
正确连接,并且视图是视图控制器的
view
属性的正确子视图,那么它应该早在
viewdiload:
之前就可用,
视图将出现:
。好的,谢谢-很高兴知道。代码是从XIB版本中直接删除的,因此看起来应该是相同的工作方式-但是尺寸标注在视图中不可用的事实将在以后出现,但不可用(无需通过其他方法操纵视图)我的主要想法是,故事板中的UIView是否会有一个设置,它显然会产生这种微妙的副作用。我将尝试在一些新代码中复制该问题。好的,我从一个完全新的项目中获得相同的行为,空的故事板(这是第二个场景,通过一个按钮连接到模式转换)。空的故事板除了两个场景(这是第二个场景,通过一个按钮连接到模式转换)。第二个场景是单视图。当我在场景控制器的viewDidLoad中执行此操作时:
-(void)viewDidLoad{[super viewDidLoad];NSLog(@“------------------------------------”);NSLog(@“viewDidLoad[TestGameController]:我的视图是:%@,[self view]);NSLog(@“viewDidLoad[TestGameController]:我的子视图1是:%@”,subViewOne);)
我想我已经发现等式中的关键项是是否为xib/情节提要启用了“自动布局”。在没有“自动布局”的情况下,IB中建立的框架用于在加载期间设置层次结构中的视图尺寸。启用“自动布局”时