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

在iOS单视图应用程序上,最早正确设置self.view.bounds的时间是什么时候?,ios,uiview,uiviewcontroller,Ios,Uiview,Uiviewcontroller,我试图添加一个覆盖整个屏幕的UITableView对象 UITableView *tabelView = [[UITableView alloc] initWithFrame:self.view.bounds]; [self.view addSubview:tabelView]; 但我意识到,即使物理iPad2旋转到横向模式,self.view.bounds在viewDidLoad和视图中将出现。只有在视图中出现它才是最后的{0,0},{1024,748} 最早将self.view.b

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

  UITableView *tabelView = [[UITableView alloc] initWithFrame:self.view.bounds];
  [self.view addSubview:tabelView];
但我意识到,即使物理iPad2旋转到横向模式,
self.view.bounds
viewDidLoad
视图中将出现
。只有在<代码>视图中出现
它才是最后的<代码>{0,0},{1024,748}

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

那么,
self.view.bounds
最早被正确设置为
{{0,0},{1024,748}
的时间是什么时候?看起来它需要稍早于代码> VisualDeals,以便空白表被绘制(用灰色线),并显示它并无缝地显示以覆盖启动图像。如果表格是在
viewdiload
中创建的,或者
viewwillshould
使用
self.view.bounds
,则表格最终宽768点,用于纵向模式

更新:我只是尝试添加发布图像,出于某种原因,即使在
viewdide
中添加了
UITableView
,也没有出现“白色屏幕闪烁”。。。我不知道为什么,但以前如果我使用
CALayer
和位图来显示内容,而没有使用任何视图或
drawRect
,那么就会出现闪烁。。。顺便说一句,我发现的最早的一个是
viewWillLayoutSubviews
,然后是
viewDidLayoutSubviews
,这两个都发生在
viewdid出现之前,都显示了
self.view.bounds
{0,0},{1024 748}


更新2:如果视图复杂且耗时,该怎么办?为了测试,我添加了一个
usleep(100000)
表格视图中:cellforrowatinexpath
为每个单元格休眠0.1秒,并且“闪烁”确实发生了。。。但是单元格和表格应该是轻量级的,而且制作速度应该很快,但是如果有其他类型的视图制作起来更耗时呢?如果我将
UITableView
创建移动到
viewWillLayoutSubviews
,则显示某些内容的速度仍然很慢,但至少没有“flash”。但是,稍后当我旋转设备时,它实际上会再次调用
viewWillLayoutSubviews
,并将另一个表添加到主视图中(屏幕大小正确),因此
viewWillLayoutSubviews
需要先删除任何旧表视图(如果有),或者只调整旧视图的大小而不添加新视图。

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

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

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

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

viewDidLoad
viewwillbeen
中,
UIView
仍然没有设置其帧/边界。将我的代码放在
viewdideappear
中起作用,但是这意味着当
UIViewController
被推到导航堆栈上时,UI将“闪烁”更新,而不是显示已经加载

我发现覆盖
viewdilayoutsubviews
解决了这个问题-在这一点上,视图有了它的边界和框架设置-我可以添加我自己的相对于其大小的子视图,所有这些都是在
viewdilayed出现之前


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

当self.view.bounds稍后更新时,如果您使用[UIApplication sharedApplication]获取界面方向.statusBarOrientation在等待边界设置之前,您可以决定如何调整您的表格大小。@Luke如果这样做有效,这可能有点麻烦,因为如果未来的iOS设备问世,而不是iPhone或iPad分辨率,我们需要依靠
self.view.bounds
?苹果公司倾向于对这些东西友好,但是,尽管我理解你的意思,你还是可以这样做(因为你想在视图出现之前绘制表格),然后将生成的帧与最终的self.view.bounds进行比较,然后根据需要进行调整。@Luke请参阅问题中的更新可能与,它确实可以工作——即使我在cell数据源提供程序中添加了一个
sleep(1)
,也没有flash,所以即使表格出来的速度非常慢(比如5秒或10秒),也没有flash,这是一个有趣的概念:我们首先将视图设置为“不正确”的大小,然后让“调整大小”在屏幕上显示之前处理它是否也有
viewWillResizeSubviews
?我用谷歌搜索了你答案中的链接,没有看到这样的调整大小消息?没有
viewWillResizeSubviews
消息。视图仅在执行自动布局时调整其子视图的大小,然后您会立即收到
viewWillLayoutSubviews
。因为您在回答中提到了
viewWillResizeSubviews
。。。在哪里