我正在尝试通过
添加覆盖整个屏幕的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}时屏幕将闪烁白屏调用,然后添加并查看表格,这样就可以看到一个白色的屏幕。
那么viewDidAppear
在self.view.bounds
正确设置的最早时间是什么时候?它似乎需要稍微在{{0, 0}, {1024, 748}}
之前,以便绘制空白表(带有灰线),并显示它并无缝地显示以掩盖启动图像。如果使用viewDidAppear
在viewDidLoad
或viewWillAppear
创建表格,则表格最终为768点宽,适用于肖像模式。
更新:我刚刚尝试添加启动图片,出于某种原因,即使在self.view.bounds
中添加UITableView
,也不会发生“白屏闪烁”。 ..我不知道为什么,但之前如果我使用viewDidAppear
和位图来显示内容,并且没有使用任何视图或CALayer
,那么闪现发生了......顺便说一下,我发现的最早的一个是drawRect
,后来又在viewWillLayoutSubviews
中,这两个都发生在viewDidLayoutSubviews
之前,并且都显示viewDidAppear
为self.view.bounds
更新2:如果视图复杂且耗时,该怎么办?为了测试,我在{{0, 0}, {1024, 748}}
中添加usleep(100000);
为每个单元格睡眠0.1秒,并且确实发生了“闪光”...但是细胞和桌子应该重量轻,速度快,但是,如果还有其他类型的视图需要更耗时?如果我将tableView:cellForRowAtIndexPath
创建移动到UITableView
,那么显示某些内容仍然很慢,但至少没有“闪现”。但是,稍后当我旋转设备时,它实际上再次调用viewWillLayoutSubviews
并将另一个表添加到主视图(具有正确的屏幕大小),因此viewWillLayoutSubviews
将需要首先删除任何旧的表视图,如果有的话,或只是调整旧的大小而不是添加新的。
答案 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元素。
在viewDidLoad
和viewWillAppear
内,UIView
仍未设置其框架/边界。将我的代码放在viewDidAppear
中,但是这意味着当UIViewController
被推送到导航堆栈时,UI会“闪烁”更新而不是已经加载。
我发现覆盖viewDidLayoutSubviews
解决了问题 - 此时,视图有其边界和框架集 - 我可以在viewDidAppear
之前添加相对于其大小的我自己的子视图。 / p>
最终结果是UI在出现之前正确加载,因此没有为用户“闪现”。