そのため、向きの変更を (コントローラーではなくビューで) 処理するには、UIDeviceOrientationDidChange 通知に登録します。すべて良い。
アプリの起動時に呼び出され、正しいサイズが報告されますが、何かが変更されたと誤って報告されます (横向きビューまたはその他のソフトウェア上の理由により、これがトリガーされる可能性があります)。
いくつかの不要なメッセージの後、正当なメッセージの送信を開始します。デバイスは正しい「to」方向を報告しますが、現在のフレーム (および境界) を提供しますが、これは無効です。
ページを右にスクロールするには、他の SO の質問により、必要なもののほとんどが含まれている contentOffset を手動で設定することを忘れないでください。currentPage = 現在の Y オフセット / スクロールビューの幅。基本的な数学、クール。
それは私の問題のほとんどを修正しました。適切な OO のために、スクロール ビューに再レイアウト機能を与えました。これは、サブビューであるため、iPad のサイズではありません。その中で、次のようにします。
float currentDeviceWidth = 768;
float currentHeight = 949; //logging the frame from portrait, landscape = 1024 w, 693 h
UIDeviceOrientation o = [[UIDevice currentDevice] orientation];
if (!UIDeviceOrientationIsPortrait(o)) {
//landscape
currentDeviceWidth = 1024;
currentHeight = 693;
}
else
NSLog(@"Moving to port, unless on startup, then its staying as");
これは、orientationDidChange: メッセージを処理しますが、アプリの起動時に、取得している境界が「変更しようとしている」かのようにサイズを設定するため、スクロール ビューは本来よりも小さくなります。
可能な解決策: a) [self performSelector:@selector(relayout) withObject:nil afterDelay:delayNum];
b)「BOOL dontIgnoreLayout」のようなものが設定/設定解除される前に時間遅延を与える
c) オリエンテーションをテストする別の方法を見つける
d) 手動で入り、すべてのメッセージが最初に送信される原因を突き止め、すべての原因を取り除きます。このオプションは、起動時にシステムによって作成されていない場合にのみ可能です。これは新しいプロジェクトですぐにテストできますが、これはエンタープライズ アプリですが、その場合はリッピングが必要になる場合があります。
誰かがこれを解決したかどうか疑問に思っています。そうでない場合は、「特別なケース」または「時間ベース」のコードを挿入する必要があります。どちらもOOスタイルではなく、少なくとも私の好みの方法ではありません(同僚もそうです)。
SOで何かを見逃した場合はお知らせください。ただし、ご覧のとおり、これまでにいくつかの答えが見つかりました。
ありがとう