在iOS单一视图应用程序中,self.view.bounds设置的最早时间是什么时候?

我正在尝试添加一个覆盖整个屏幕的UITableView对象

  UITableView *tabelView = [[UITableView alloc] initWithFrame:self.view.bounds]; [self.view addSubview:tabelView]; 

但是我意识到,即使将物理iPad 2旋转到横向模式, self.view.bounds也是在viewDidLoadviewWillAppear {{0, 0}, {768, 1004}} 。 只有在viewDidAppear它终于{{0, 0}, {1024, 748}}

self.view.bounds被设置为{{0, 0}, {1024, 748}}的最早时间是什么时候? 如果viewDidAppear是一个,那么我必须在那里创buildUITableView ,如果“启动图像”是一个静态的横向空白表,那么当viewDidAppear被调用时,屏幕将会闪烁白色屏幕,然后添加和看见表,所以看到一个白色的屏幕闪光。

那么self.view.bounds设置为{{0, 0}, {1024, 748}}的最早时间是什么时候? 看起来好像在viewDidAppear之前需要稍微做一点,这样就可以绘制空白表格(用灰色线条),并将其显示出来并无缝地显示来覆盖启动图像。 如果表格是使用self.view.boundsviewDidLoadviewWillAppear创build的,那么表格最终会self.view.bounds 768点宽度,并用于纵向模式。

更新:我只是试图添加启动图像,由于某种原因,即使UITableView添加在viewDidAppear ,“白屏的闪光”没有发生…我不知道为什么,但以前如果我使用CALayer和位图显示的内容,并没有使用任何视图或drawRect ,然后发生闪光…顺便说一下,我发现最早的一个是viewWillLayoutSubviews ,然后在viewDidLayoutSubviews ,这两个发生在viewDidAppear之前,和都显示self.view.bounds{{0, 0}, {1024, 748}}

更新2:如果视图复杂且费时,该怎么办? 为了testing,我添加了一个usleep(100000); tableView:cellForRowAtIndexPath为每个单元睡0.1秒,并且“闪光”确实发生了…但细胞和表应该是重量轻和快速,但如果有其他types的视图是更多的时间耗费多less? 如果我将UITableView创build移动到viewWillLayoutSubviews ,那么显示内容仍然很慢,但至less没有“flash”。 然而,稍后当我旋转设备,它实际上再次调用viewWillLayoutSubviews并添加另一个表到主视图(具有正确的屏幕大小),所以viewWillLayoutSubviews将需要删除任何旧的表视图,如果有的话,或者只是调整旧一个而不是添加一个新的。

避免使用Flash的最简单方法是在viewDidLoad创build表视图,并正确设置表视图的自动识别掩码,以便系统自动使表视图填充其超级视图:

 - (void)viewDidLoad { [super viewDidLoad]; UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds]; tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; [self.view addSubview:tableView]; } 

否则,您可以看到最后的视图边界的最早时间是在视图控制器的viewWillLayoutSubviews方法中。 您可以在viewDidLoad添加一次表格视图,然后在viewWillLayoutSubviews调整其框架,或调用其后的方法。 看到我的答案UIViewController返回无效的框架? 更多细节。

我试图解决一个类似的问题 – 我想加载一些UI元素编程的基础上在界面生成器中添加一个UIView的大小。

viewDidLoadviewWillAppear里面, UIView还没有设置其框架/边界。 将我的代码放在viewDidAppear里面,但是这意味着UI将会随着更新而“闪现”,而不是在UIViewController被推入导航堆栈时显示已经加载。

我发现覆盖viewDidLayoutSubviews解决了这个问题 – 在这一点上,视图有其界限和框架设置 – 我可以添加在我自己的子视图相对于它的大小,所有之前viewDidAppear

最终的结果是UI出现之前正确加载,因此并没有为用户“闪现”。