0

多くのViewcontrollerをホストするUIViewcontrollerがあります。それとそのサブビューに自動回転を設定しました。アプリが読み込まれると正常に動作します。私が抱えている問題は、最初の読み込みプロセス中に、アプリがいくつかのファイルをローカルに接続してダウンロードする必要があることです。このロード中に、ユーザーがiPadを回転させると、UIViewControllerが正しく回転しません。私はフラグを設定し、自動回転する必要がありますが、それでも機能しません。

PS:私はこれらの4つの方向を許可しています:

 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
 {
  return (interfaceOrientation == UIInterfaceOrientationPortrait ||
        interfaceOrientation == UIInterfaceOrientationLandscapeLeft ||
        interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown ||
        interfaceOrientation == UIInterfaceOrientationLandscapeRight);
 }

ロードが完了すると、動作は正しくなり、適切に回転します。これは、これらの内部VCの一部がデータをロードしているためである可能性があると考えました。説明させてください。bigViewControllerは他のすべてのVCをホストし(彼をBigDaddyと呼びましょう)、BigdaddyのViewdidloadで(議論のために)他に3つありますViewControllers:Busta、Skeezix、およびローレンス。私もです:

[[Busta alloc] initWithNibName:@"Busta" bundle:nil];

-viewDidLoadこれにより、Bustaのが呼び出されるので、次のようにして、その非同期のファイル読み込みセクションを作成しました。

    dispatch_async(dispatch_get_main_queue(), ^{
    }); 

これらの変更は、非同期ディスパッチの前にロードプロセスに5秒かかるという意味で少し役立ちました(そして、それらの秒でiPadの傾きが回転イベントを引き起こし、ビュー全体が消えます。今、私はそれらの5を取得しました秒から1.2秒まで。私の質問は、問題の解決策はありますか?それは機能しませんか?アプリを4方向に回転させ、データの読み込み中に回転の変化に応答することは可能ですか?

4

2 に答える 2

1

問題は、「接続」の実行方法にあると思われます。NSURLConnectionなどを使用してリモートサーバーに接続していることを意味していると思います。メインスレッドで同期接続を使用する場合は、接続が完了するまでアプリフリーズすることに注意してください。適切な方法は、非同期呼び出しを利用するか、作業をセカンダリスレッドに移動して(NSOperationQueueのドキュメントを参照)、その情報に基づいてUIの更新をメインスレッドに戻すことです(NSOperationQueueのドキュメントを再度参照)。

WWDC2012のビデオにこの良い例があります。

于 2013-02-24T04:23:25.543 に答える
0

-shouldAutorotateToInterfaceOrientation...アプリが必要なデータの読み込みを完了した後にのみ回転できるようにメソッドを実装してみませんか?

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    BOOL appIsFinishedLoadingData = <your code here>
    return shouldRotate;
}

(可能なすべてのローテーションを許可しているという事実を考慮してコードを短縮したので、どのローテーションが提供されているかを確認する必要はありません。あなたの方法はより将来性があり、私の方が少し読みやすくなっています。)

于 2013-02-24T04:23:52.887 に答える