2

一部のコードをXIBからストーリーボードに変更しています。ストーリーボードシーンのサブビューのフレーム境界を設定するタイミングには、かなりの違いがあるようです。

このコードが頻繁に使用する手法は次のとおりです。

  • UIViewサブビューには、XIBまたはストーリーボードファイルで定義されたディメンションがあります(プログラマー以外の誰かがUIを変更できるようにします)
  • UIViewControllerには、オブジェクトへのリンクがあります。IBObject UIView *
  • UIViewController- viewWillAppear()では、特定の計算が行われ、それらの計算に基づいて描画が行われます。

たとえば、XIBまたはストーリーボードファイルには、4つの領域に分割したいUIViewがあります。コントローラは、そのUIViewの境界を確認し、そのフレームを確認してから、UIViewに4つのボックスを描画します。各ボックスのサイズは4分の1です。

.hで:

IBOutlet UIView *outputColorKeyView;

.mのviewWillAppear

CGRect keyBounds = [outputColorKeyView bounds];

float high = keyBounds.size.height;
float wide = keyBounds.size.width;

float cellWidth = wide/4.0;

XLog(@"Dimensions for the color key are: %f %f", high, wide);

私の問題は、XIBの下では、これがうまく機能したことです。たとえば、描画する必要のある領域の寸法が200ポイント幅であり、セルを50ポイント幅で描画できることがわかりました。

viewWillAppearストーリーボードでは、これは機能しなくなりました。コントローラーのメソッドから呼び出しているときに、(0,0,0,0)のフレームが表示されます。

[18:09:16.901|4096] Dimensions for the color key are: 0.000000 0.000000

ただし、プログラムのライフサイクルの後半(ボタンによってトリガーされる)から実行すると、正しい結果が得られます。

[18:09:35.812|4096] Dimensions for the color key are: 36.000000 734.000000

ビューが表示される前にこの情報を取得する方法はありますか?そう思いviewWillAppearますが、実際にビューがレンダリングされる前の最後の機会のようです。または、このテクニックを意図したとおりに機能させるために、私が見逃している明らかなスイッチがいくつかありますか?

ありがとう

4

1 に答える 1

4

答えは私のフォローアップの質問への答えで与えられました...このようなことをする場所は、レイアウトが完了した後です。viewDidLayoutSubviews

情報が変更された理由は、最初の説明ファイル(XIBまたはストーリーボード)のデータviewDidLoadから現在(0,0,0,0)になっているのかわかりません、違いがあります。書籍やネット上にある多くのチュートリアルコードに従うかどうかに注意してください。

于 2012-11-16T04:09:01.190 に答える