2

これは本当に奇妙です。3つの画像を含むスクロールビューがあり、ユーザーはスワイプして次の画像を表示します。ただし、最初の画面を中央の画像から開始したいと思います。簡単; setContentOffsetを使用すると、すべて問題ありません。

コードはiPhoneシミュレーターでは機能しますが、iPadシミュレーター(またはデバイス!)では機能しません。

CGRect screen = [[UIScreen mainScreen] bounds];
CGFloat height = CGRectGetHeight(screen);
CGFloat width = CGRectGetWidth(screen);

CGPoint rightOffset = CGPointMake(width, 0);
[scrollView setContentOffset:rightOffset animated:YES];

scrollViewが追加される直前にすべて設定されます(実際、scrollviewが追加された後に同じ結果でこれを行うことができます)。

widthは、iPadでは768、iPhoneでは320を返します。

これはバグですか?Xcode4.4.1およびios6。

編集:

これは作成順序に関係しているように見えます。viewDidLoadではなくviewWillAppearに移動し、iPhoneとiPadで動作しているようです。ただ矛盾は非常に驚くべきことです....

4

1 に答える 1

9

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

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

viewDidAppear.

更新 (ios6)

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

これは、 -viewWillAppear の後に呼び出されます。ただし、注意してください - それらは常に一緒に呼び出されるわけではありません。たとえば、-viewWDidLayoutSubviews は回転後に呼び出されますが、-viewWidAppear は呼び出されません。-viewWillAppear は、ビューが可視ビューになるたびに呼び出されます*。

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

于 2012-12-16T19:56:16.097 に答える