0

そのため、向きの変更を (コントローラーではなくビューで) 処理するには、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で何かを見逃した場合はお知らせください。ただし、ご覧のとおり、これまでにいくつかの答えが見つかりました。

ありがとう

4

1 に答える 1

0

代わりにステータスバーの向きをテストして他の人の例に従いました。これは常に正しいように見え、UIDevice currentOrientationと競合するメッセージが表示されます...これは以前に見つかったことがありますが、これで問題が修正された具体的な理由は次のとおりです。

他のスレッドの提案によると、viewDidLoadではなくViewDidAppearで通知に登録しましたが、この組み合わせが勝者のようです。

于 2012-05-15T17:34:38.930 に答える