web-dev-qa-db-ja.com

viewDidLoadの誤ったフレームサイズ

可能性のある複製:
viewDidLoadでビューのフレームを手動で設定する必要があるのはなぜですか

viewDidLoadのiphoneシミュレーターでアプリを実行すると、nibの各要素のすべてのフレームが正しい場合、iphoneとipad、2つのストーリーボード用のユニバーサルアプリがあります。しかし、ipad(シミュレーター)のフレームでそれを行うと、フレームはゼロになりますが、画面は正しく見えます。ちょっと教えてください。ありがとう。

33
Oleg

これは非常によく似た質問です iosでiPadでsetContentOffsetが動作しない ...そして、私の答えはそこと同じです:

「ビューのジオメトリがこの時点で設定されておらず、結果が予測できないため、viewDidLoadでUIジオメトリ関連のものを初期化しないでください。

... viewWillAppear:はこれらのことを行う正しい場所です。この時点でジオメトリが設定されているため、ジオメトリ関連のプロパティを取得および設定するのが理にかなっています。

これは、gettingジオメトリ関連のプロパティにも適用されます。ある状況では正しく動作し、別の状況では正しく動作しないことに気を取られないでください。主なポイントは、ジオメトリプロパティの設定/取得が早すぎると予測不能の結果が得られることです。

画面looks結果が表示されているため正しいafterviewWillAppear:/viewDidAppear:

update(ios6)

Ios6で自動レイアウトを使用する場合、サブビューがレイアウトされるまでフレームは設定されません。これらの条件下でフレームデータを取得する適切な場所は、viewControllerメソッドviewDidLayoutSubviewsです。

これはafterviewWillAppear:と呼ばれます。しかし、注意してください-彼らは常に一緒に呼び出されるとは限りません。たとえば、viewDidLayoutSubviewsは回転後に呼び出されますが、viewWillAppear:は呼び出されません。 viewWillAppear:は、ビューが表示されるビューになるたびに呼び出されます*、viewDidLayoutSubviewsは必ずしもそうではありません(ビューのリレーが必要な場合のみ)。

(*アプリがバックグラウンドでフォアグラウンドアプリになっていない限り、viewWillAppear:は呼び出されません)

108
foundry

私はそれがなぜ起こったのかを理解しました。 AutoLayoutを使用していました。ストーリーボードでチェックを外すと、フレームが正しくなります。

7
Oleg