一部のコードを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
ますが、実際にビューがレンダリングされる前の最後の機会のようです。または、このテクニックを意図したとおりに機能させるために、私が見逃している明らかなスイッチがいくつかありますか?
ありがとう