1

なぜ次のことが起こっているのか(そしてそれを修正する方法)を理解するのに苦労しています。

分割ビュー ベースのアプリケーションを使用してアプリケーションを作成しました。

RootViewController.m にあるこのメソッドを呼び出す showTheModal という UiBarButtonItem を追加しました。

- (IBAction)showTheModal:(id)sender {
theModalController.modalPresentationStyle = UIModalPresentationFullScreen;
theModalController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self presentModalViewController:theModalController animated:YES];

if ([detailViewController popoverController] != nil)
    [[detailViewController popoverController] dismissPopoverAnimated:YES];

もちろん、BarButtonItem は Default Root Controller の下部 (横向きの分割ビューの左側) またはポップアップの下部 (横向きの場合) に表示されます。

モーダル ビューは、ツールバーに配置されたボタンによって閉じられます。以下を呼び出します。

[self dismissModalViewControllerAnimated: YES];

私が抱えている問題は、モーダルがアップしている間に画面を回転させる場合です。さまざまなシナリオで何が起こるかを次に示します (start は showTheModal ボタンを押したときの方向を指し、end は、dismissModal ボタンを押したときの方向を指します)。

1) 開始風景、終了風景: すべて正常に表示されます。willHideViewController および willShowViewController メソッドが RootViewController で呼び出されない (予想どおり)

2) 横向きで開始し、縦向きで終了: UI は正常に表示されます。willHideViewController が 2 回実行される (なぜ?)

3) 縦向きの開始、縦向きの終了: UI は正常に表示されます。willHideViewController は 1 回実行されます (予想どおり)

4) 縦向きの開始、横向きの終了: 「ルート リスト」ボタンは詳細ビュー (分割ビューの右側) に残ります。willHideViewController と willShowViewController のどちらも呼び出されません (なぜ??)

#2 と #4 が期待どおりに動作しない理由について何か考えはありますか?

4

5 に答える 5

1

私はまったく同じ問題を抱えていました(上記の#4)。を使用して回避しviewDidAppear:animated、ビューの高さをチェックして、横向きか縦向きかを確認しました。(うん、ギャグなど)私はその「解決策」にまったく満足していません。

おそらく関連:縦向きモードのボタンは、横向きに回転した後、ゆっくりと消えることに気づきました。つまり、回転が終了した後、ボタンが1秒間表示されます。ただし、Mail.appでは、ローテーションが開始されるとすぐに[受信トレイ]ボタンが消えます。Appleは、ドキュメントで推奨されているものとは異なる方法で物事を行っていますか?おそらく、マスタービューボタンを表示/非表示にするより効率的な方法がありますか?

于 2010-06-06T14:38:33.170 に答える
1

残念ながら、これはバグではありません。これは予期された動作のようです。

iOS 5.0 の iOS リリース ノートの「メモと既知の問題」セクションでこれを見つけました。

iOS 5 の回転コールバックは、全画面表示されるビュー コントローラーには適用されません。これが意味することは、コードが別のView Controllerの上にView Controllerを提示し、その後ユーザーがデバイスを別の方向に回転させた場合、却下時に、基礎となるコントローラー(つまり、提示しているコントローラー)は回転コールバックを受信しないということです。ただし、表示中のコントローラーは、再表示時に viewWillLayoutSubviews 呼び出しを受け取り、このメソッドから interfaceOrientation プロパティを照会して、コントローラーを正しくレイアウトするために使用できることに注意してください。

于 2012-05-31T06:29:03.233 に答える
0

これはAppleDevelopmentに報告する必要のあるバグだと思います。

UIModalPresentationPageSheetフォーマットを使用してモーダルビューを表示することにより、この問題の一部を回避しました。

于 2010-08-23T21:23:52.890 に答える
0

診断のために、最初にポップオーバー ビューを閉じてみましたか? または、印刷してメソッドを呼び出している人をログに記録し(id) senderますか?

于 2010-05-08T23:18:41.547 に答える
0

私はまったく同じ問題を抱えていました。

(2) の答えとしては、バグのようです。モーダル ビューが分割ビューにプッシュされると、オリエンテーション メッセージがどこかにキューに入れられ、モーダル ビューが閉じられて分割ビューが表示されるまで処理されないことに気付きましたが、それでもコールバックが 1 つしか取得されないことが予想されます。

(4) については、これもバグのようです。幸いなことに、didRotate... イベントは引き続き通過するため、私の解決策は、この場合は UISplitViewController をサブクラス化し、デリゲートの willShowViewController メソッドを明示的に呼び出すことでした。

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    [super didRotateFromInterfaceOrientation:fromInterfaceOrientation];

    //Work around a bug where UISplitViewController does not send 
    //willShowViewController after a modal is presented in portrait
    //but dismissed in landscape.
    UIInterfaceOrientation orientation = self.interfaceOrientation;
    if ( (orientation == UIInterfaceOrientationLandscapeLeft )
        || (orientation == UIInterfaceOrientationLandscapeRight) )
    {
        UINavigationItem* item = [detail.navigationBar.items objectAtIndex:0];
        UIBarButtonItem* barButtonItem = [item leftBarButtonItem];
        [super.delegate splitViewController:self willShowViewController:master invalidatingBarButtonItem:barButtonItem];
    }
}

ここで、「マスター」は分割ビューのマスター ビュー コントローラー (左側) を参照する IBOutlet であり、「詳細」は詳細ビュー コントローラー (右側のサイズ) の IBOutlet です。

私の場合、詳細ビューは UINavigationController であることに注意してください。ビュー コントローラから barButtonItem を取得するには、別のコードが必要になる場合があります。

また、これには、通常の回転のために willShowViewController を 2 回呼び出すという副作用がありますが、私の場合は問題ではありません。

于 2010-11-12T02:50:47.567 に答える