まず、これは主に効率の問題です。`viewDidLayoutSubviews`のフレーム計算
viewWillAppear
が早すぎてviewDidAppear
が遅すぎる(表示は既に表示されている)フレーム計算を行う場所については、多くの議論があります。
一般的な答えは、viewDidLayoutSubviews
でフレーム計算を行うことです。問題は、複数回呼び出されることです。さらに悪いことに、最も正確なコール、つまりすべてのフレームが最終サイズを持つコールが最後のコールです。私の知る限り、どのような呼び出しが最終的なものかを知る方法はありません。
frameAreSetフラグ(初期化済みの偽)とチェックがあります。フレームがゼロでない場合(self.view.frame.size.width != 0
など)、 'framesAreSet'がfalseの場合は、フラグが入り、1回だけ計算されます。ような何か:
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
if (self.view.frame.size.width != 0 && !framesAreSet)
{
framesAreSet = true;
//Calculate frames here
}
}
これは大丈夫に見えますが、真実で、self.view.frame.size.width != 0
のようなもののチェックがフレームが実際に設定されていることをない保証を行います。 viewDidLayoutSubviews
が後で呼び出されるという事実は、いくつかのフレームが最終状態に設定されていないことを示唆しています。
viewCompleteLayoutSubviews
を持っているとよいでしょう。すべてのフレームが設定され、ビューがまだ表示されていないときに、「1回限り」のフレーム計算を行う最良の方法は何ですか?
(これはおそらくNSConstraintsを使用してビューないの問題です)
'viewDidLayoutSubviews'が複数回呼び出されるのはなぜですか?あなたはどんな問題に直面していますか? – rmaddy
ここで 'self.view'の範囲を更新していますか?もしそうなら、あなたの問題です。 – Clafou
@rmaddy冗長性は良いコーディング方法ではありません。複雑なViewControllerを持っていて、コード内に多くのサブビューを追加し(実際にはほとんどコードで作成されます)、設定フレームのための多くの計算を行います。実際には、「重い」計算を呼び出すのは、サブビューを追加するだけで何度も呼び出すことを想像してください。最後のものを除くすべてが冗長です。時には「それは働く」ことが十分ではない。 – bauerMusic