5

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}}? が 1 つである場合viewDidAppearは、そこに作成する必要がありますUITableView。「起動イメージ」が静的な横向きの空白のテーブルである場合、 が呼び出されると画面が白い画面で点滅しviewDidAppear、テーブルが追加されて表示されるので、白い画面のフラッシュが見られます。

self.view.boundsでは、正しく設定されている最も早い時刻は{{0, 0}, {1024, 748}}いつですか? viewDidAppear空白のテーブルが(灰色の線で)描画され、それが表示され、Launch 画像を覆うようにシームレスに表示されるように、少し前にする必要があるようです。viewDidLoad表が で、またはviewWillAppearを使用して作成された場合、表のself.view.bounds幅は 768 ポイントになり、ポートレート モード用になります。

更新:起動イメージを追加しようとしましたが、何らかの理由で、UITableViewが追加されていてもviewDidAppear、「白い画面のフラッシュ」は発生しませんでした...理由はわかりませんが、以前にCALayerビットマップを使用した場合コンテンツを表示し、ビューまたはを使用しなかった場合、フラッシュが発生しdrawRectました...ちなみに、私が見つけた最初のものはviewWillLayoutSubviewsviewDidLayoutSubviewsviewDidAppearself.view.bounds{{0, 0}, {1024, 748}}

更新 2: ビューが複雑で作成に時間がかかる場合はどうすればよいですか? テストするために、各セルに 0.1 秒のスリープを追加したusleep(100000);ところtableView:cellForRowAtIndexPath、「フラッシュ」が発生しました...しかし、セルとテーブルは軽量で高速に作成する必要があると思われますが、他のタイプのビューがある場合はどうなりますか?作るのにもっと時間がかかりますか?UITableView作成をに移動しviewWillLayoutSubviewsても、何かを表示するのはまだ遅いですが、少なくとも「フラッシュ」はありません。ただし、後でデバイスを回転させると、実際にはviewWillLayoutSubviews再度呼び出され、別のテーブルがメイン ビューに追加されます (正しい画面サイズで)。そのためviewWillLayoutSubviews、古いテーブル ビューがある場合は最初に削除するか、古いテーブル ビューのサイズを変更する必要があります。新しいものを追加しないでください。

4

2 に答える 2

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が無効なフレームを返すという私の答えを参照してください。詳細については。

于 2012-08-25T07:44:54.330 に答える
1

UIView私は同様の問題を解決しようとしていました-InterfaceBuilderで追加されたサイズに基づいてプログラムでいくつかのUI要素をロードしたかったのです。

内部viewDidLoadviewWillAppearUIViewまだフレーム/境界が設定されていませんでした。コードを内部に配置することは機能しましたが、UIがナビゲーションスタックにプッシュさviewDidAppearれたときにすでにロードされているように見えるのではなく、更新で「フラッシュ」することを意味しました。UIViewController

オーバーライドすることで問題が解決したことがわかりましたviewDidLayoutSubviews。その時点で、ビューには境界とフレームが設定されていました。以前は、サイズに応じて独自のサブビューを追加できましたviewDidAppear

その結果、UIは表示される前に正しく読み込まれたため、ユーザーに「フラッシュ」されませんでした。

于 2013-02-20T22:36:37.063 に答える