35

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

私はiphoneとipad用のユニバーサルアプリ、2つのストーリーボードを持っていviewDidLoadます。ペン先の各要素のすべてのフレームでiphoneシミュレーターでアプリを実行すると、正しいです。しかし、フレーム内のipad(シミュレーター)に対してそれを行うと、nilになりますが、画面は正しく見えます。smthを教えていただけませんか。ありがとう。

4

2 に答える 2

110

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

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

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

これは、ジオメトリ関連のプロパティの取得にも当てはまります。ある状況では正しく動作し、別の状況では正しく動作しないことに気を取られないでください...要点は、ジオメトリプロパティの設定/取得が早すぎると、予測できない結果が生じることです。

/のに結果が表示されているため、画面は正しく表示されます viewWillAppear:viewDidAppear:

アップデート(ios6)

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

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

(*アプリがバックグラウンドでフォアグラウンドアプリになっている場合を除き、viewWillAppear:呼び出されません)

于 2012-12-28T04:43:11.983 に答える
7

どうしてこうなったのかが分かりました。私はオートレイアウトを使用していました。ストーリーボードでチェックを外すと、フレームは正しいです。

于 2012-12-28T08:10:18.507 に答える