在iOS单一视图应用程序中,self.view.bounds设置的最早时间是什么时候?
我正在尝试添加一个覆盖整个屏幕的UITableView
对象
UITableView *tabelView = [[UITableView alloc] initWithFrame:self.view.bounds]; [self.view addSubview:tabelView];
但是我意识到,即使将物理iPad 2旋转到横向模式, self.view.bounds
也是在viewDidLoad
和viewWillAppear
{{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.bounds
在viewDidLoad
或viewWillAppear
创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
的大小。
在viewDidLoad
和viewWillAppear
里面, UIView
还没有设置其框架/边界。 将我的代码放在viewDidAppear
里面,但是这意味着UI将会随着更新而“闪现”,而不是在UIViewController
被推入导航堆栈时显示已经加载。
我发现覆盖viewDidLayoutSubviews
解决了这个问题 – 在这一点上,视图有其界限和框架设置 – 我可以添加在我自己的子视图相对于它的大小,所有之前viewDidAppear
。
最终的结果是UI出现之前正确加载,因此并没有为用户“闪现”。