在iOS单视图应用中,何时是self.view.bounds设置正确的最早时间?

时间:2012-08-25 03:26:04

标签: ios uiview uiviewcontroller

我正在尝试通过

添加覆盖整个屏幕的UITableView对象
  UITableView *tabelView = [[UITableView alloc] initWithFrame:self.view.bounds];
  [self.view addSubview:tabelView];

但我意识到即使将物理iPad 2旋转到横向模式,self.view.bounds{{0, 0}, {768, 1004}}中的viewDidLoad也是viewWillAppear。仅在viewDidAppear中才最终{{0, 0}, {1024, 748}}

self.view.bounds正确设置为{{0, 0}, {1024, 748}}的最早时间是多少?如果是viewDidAppear,那么我必须在那里创建UITableView,如果“启动图像”是静态横向空白表,那么当{{1}时屏幕将闪烁白屏调用,然后添加并查看表格,这样就可以看到一个白色的屏幕。

那么viewDidAppearself.view.bounds正确设置的最早时间是什么时候?它似乎需要稍微在{{0, 0}, {1024, 748}}之前,以便绘制空白表(带有灰线),并显示它并无缝地显示以掩盖启动图像。如果使用viewDidAppearviewDidLoadviewWillAppear创建表格,则表格最终为768点宽,适用于肖像模式。

更新:我刚刚尝试添加启动图片,出于某种原因,即使在self.view.bounds中添加UITableView,也不会发生“白屏闪烁”。 ..我不知道为什么,但之前如果我使用viewDidAppear和位图来显示内容,并且没有使用任何视图或CALayer,那么闪现发生了......顺便说一下,我发现的最早的一个是drawRect,后来又在viewWillLayoutSubviews中,这两个都发生在viewDidLayoutSubviews之前,并且都显示viewDidAppearself.view.bounds

更新2:如果视图复杂且耗时,该怎么办?为了测试,我在{{0, 0}, {1024, 748}}中添加usleep(100000);为每个单元格睡眠0.1秒,并且确实发生了“闪光”...但是细胞和桌子应该重量轻,速度快,但是,如果还有其他类型的视图需要更耗时?如果我将tableView:cellForRowAtIndexPath创建移动到UITableView,那么显示某些内容仍然很慢,但至少没有“闪现”。但是,稍后当我旋转设备时,它实际上再次调用viewWillLayoutSubviews并将另一个表添加到主视图(具有正确的屏幕大小),因此viewWillLayoutSubviews将需要首先删除任何旧的表视图,如果有的话,或只是调整旧的大小而不是添加新的。

2 个答案:

答案 0 :(得分:4)

避免闪存的最简单方法是在viewDidLoad中创建表视图并正确设置表视图的自动调整掩码,以便系统自动使表视图填充其超级视图:

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

否则,您可以在视图控制器的viewWillLayoutSubviews方法中看到最终视图边界的最早时间。您可以在viewDidLoad中添加一次表格视图,然后在viewWillLayoutSubviews或之后调用的方法中调整其框架。有关详细信息,请参阅我对UIViewController returns invalid frame?的回答。

答案 1 :(得分:1)

我试图解决类似的问题 - 我想根据Interface Builder中添加的UIView的大小以编程方式加载一些UI元素。

viewDidLoadviewWillAppear内,UIView仍未设置其框架/边界。将我的代码放在viewDidAppear中,但是这意味着当UIViewController被推送到导航堆栈时,UI会“闪烁”更新而不是已经加载。

我发现覆盖viewDidLayoutSubviews解决了问题 - 此时,视图有其边界和框架集 - 我可以在viewDidAppear之前添加相对于其大小的我自己的子视图。 / p>

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