【问题标题】:How to get subviews frames early in initialization process如何在初始化过程中及早获取子视图帧
【发布时间】:2012-11-16 12:09:01
【问题描述】:

我正在将一些代码从 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 似乎是实际呈现视图之前的最后机会。或者是否有一些我遗漏的明显开关可以使这项技术按预期工作?

谢谢

【问题讨论】:

  • 那里发生了其他事情。如果IBOutlet 正确连接并且视图是视图控制器的view 属性的正确子视图,那么它应该早在viewDidLoad:...之前可用viewWillAppear:
  • 好的,谢谢 - 很高兴知道。该代码是直接从 XIB 版本中删除的,所以它似乎应该以相同的方式工作 - 但是尺寸不能从 viewWillAppear 获得但以后不可用(没有通过其他其他方法操作视图)的事实让我想知道。
  • 我的主要想法是,故事板中的 UIView 是否可能存在一个非明显具有这种微妙副作用的设置。我会尝试在一些新代码中复制这个问题。
  • 好的,我从一个全新的项目中得到了相同的行为,空的故事板(这是第二个场景,由一个带有模式转换的按钮连接)。
  • 空故事板,除了两个场景(这是第二个场景,由一个带有模式转换的按钮连接)。第二个场景是单个 UIView。当我在场景控制器的 viewDidLoad 中执行此操作时:- (void)viewDidLoad { [super viewDidLoad]; NSLog(@"---------------------------"); NSLog(@"viewDidLoad[TestGameController]: my view is: %@", [self view]); NSLog(@"viewDidLoad[TestGameController]: my subview1 is: %@", subViewOne); }

标签: ios uistoryboard


【解决方案1】:

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

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

【讨论】:

  • 我想我发现等式中的关键项是是否为 xib/storyboard 启用了“自动布局”。如果没有“自动布局”,则在 IB 中建立的框架用于在加载期间设置层次结构中的视图大小。启用“自动布局”后,尺寸会延迟到子视图布局(如上所述)。
猜你喜欢
  • 2018-01-10
  • 2016-08-16
  • 2016-11-23
  • 1970-01-01
  • 1970-01-01
  • 2015-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多