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

nop*_*ole 5 uiviewcontroller uiview ios

我试图添加一个UITableView覆盖整个屏幕的对象

  UITableView *tabelView = [[UITableView alloc] initWithFrame:self.view.bounds];
  [self.view addSubview:tabelView];
Run Code Online (Sandbox Code Playgroud)

但我意识到,即使物理iPad 2的旋转为横向模式,self.view.bounds{{0, 0}, {768, 1004}}viewDidLoadviewWillAppear.只有在viewDidAppear最后{{0, 0}, {1024, 748}}

self.view.bounds正确的设定时间是什么时候{{0, 0}, {1024, 748}}?如果viewDidAppear是那个,那么我必须在UITableView那里创建,如果"启动图像"是静态横向空白表,那么当viewDidAppear调用时屏幕将闪烁白色屏幕,然后添加并查看表格,看到闪光的白色屏幕.

那么什么时候最早的时间self.view.bounds设置正确{{0, 0}, {1024, 748}}呢?它似乎需要稍微提前viewDidAppear,以便绘制空白表(使用灰线),并显示它并无缝显示以掩盖启动图像.如果在表中创建表viewDidLoadviewWillAppear使用self.view.bounds表,则表最终为768点宽,适用于纵向模式.

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

更新2:如果视图复杂且耗时,该怎么办?为了测试,我添加了一个usleep(100000);tableView:cellForRowAtIndexPath睡觉0.1秒每个单元格,而"闪电侠"的确发生了......但细胞和桌子,好像应该是重量轻,速度快使,但如果有其他类型的观点,即制作时间更长?如果我将UITableView创作移动到viewWillLayoutSubviews,那么显示某些东西的速度仍然很慢,但至少没有"闪光".但是,稍后当我旋转设备时,它实际上viewWillLayoutSubviews再次调用并将另一个表添加到主视图(具有正确的屏幕大小),因此viewWillLayoutSubviews需要首先删除任何旧的表视图(如果有的话),或者仅调整旧的视图大小和不添加新的.

rob*_*off 4

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

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

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