在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
。。。在哪里