5

我正在尝试添加一个UITableView覆盖整个屏幕的对象,通过

  UITableView *tabelView = [[UITableView alloc] initWithFrame:self.view.bounds];
  [self.view addSubview:tabelView];

但我意识到即使物理 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,这样才能画出空白表(用灰线),并显示出来,无缝显示以掩盖Launch图像。如果表格是在viewDidLoadviewWillAppear使用中创建的self.view.bounds,则表格最终为 768 点宽,适用于纵向模式。

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

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

4

2 回答 2

4

避免flash的最简单方法是在其中创建表格视图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 返回无效帧的回答了吗?更多细节。

于 2012-08-25T07:44:54.330 回答
1

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

viewDidLoadand内部viewWillAppearUIView仍然没有设置它的框架/边界。将我的代码放入viewDidAppear其中是可行的,但这意味着 UI 会随着更新而“闪烁”,而不是在将UIViewController其推送到导航堆栈时显示为已经加载。

我发现覆盖viewDidLayoutSubviews解决了这个问题——在这一点上,视图有它的边界和框架集——我可以在我自己的子视图中添加相对于它的大小,所有之前viewDidAppear

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

于 2013-02-20T22:36:37.063 回答