2016-04-14 8 views
0

を使用して回転:は、私は、次の許可の方向で(ストーリーボードで作成)のViewController階層を持つpopToRootViewController

+---------------+  +------------------+  +------------------+ 
+  VC1  +  +  VC2  +  +  VC3  + 
+    + -> +     + -> +     + 
+ Portrait Only +  + All orientations +  + All orientations + 
+---------------+  +------------------+  +------------------+ 

許さ回転は、これらすべてのViewControllersのsupportedInterfaceOrientationsshouldAutorotate方法に従って作業を行うようにするためには

public class SingleOrientationNavigationController: UINavigationController { 

    public override func shouldAutorotate() -> Bool { 
     if let topVC = topViewController { 
      return topVC.shouldAutorotate() 
     } 
     return false 
    } 

    public override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask { 
     if let topVC = topViewController { 
      return topVC.supportedInterfaceOrientations() 
     } 
     return UIInterfaceOrientationMask.Portrait 
    } 
} 

デバイスが回転すると、方法shouldAutorotateがnavigationCoのために呼び出されます、私はこの単純な実装で、カスタムUINavigationControllerサブクラスを作成しました(私のアプリケーションのルートコントローラです)は、一番上のView Controllerの値を返します。自由に回転できるVC2とVC3を押すとすべてがうまく行きます。


は今(VC1が唯一の肖像画をサポートしていますので、肖像画に)、私は、VC2を押す(VC2がすべての方向をサポートしているので)画面を回転し、ルートビューコントローラにポップ。私は、次のデバッグトレースを得た:

enter image description here

supportedInterfaceOrientations方法は(ライン0と1で)VC1のために呼ばれ、したがって、システムは、それが適切にVC1を表示するために回転する必要が知ることができる:回転作品良い。

VC3がランドスケープモードの間にpopToRootViewControllerAnimatedを使用してVC3からVC1にポップしようとすると問題が発生します。このケースは、サーバーへの接続が失われたときに発生するため、ルートビューコントローラーに戻る必要があります。 supportedInterfaceOrientationsが呼び出されていないので(VC1とVC2のどちらも)、VC1はランドスケープで表示されているので、前のトレースを取得できません。

VC3からVC1に直接ポップして、正しい向きで表示させるにはどうすればよいですか?私はVC3からVC2へ、次にVC2からVC1へポップできることを知っていますが、可能であればVC3からVC1に直接行きたいと思います。

+0

私はそれが可能ではないと思います。私が回転を強制することができたと感じる唯一の時間は、モーダルを表示しなくてもそれを却下することです。私はあなたがVC1の上にナビゲーションコントローラを表示し、その後VC1に戻ってみたいと思ったら、それを却下してカスタムアニメーションを作って、右からプッシュされているか、左からポップされているように見えるかと思います。しかし、優れたソリューションがあれば:3 –

答えて

0

私はスタックで新しいと私は質問に答えるために遅くないことを望むが、私は著者と同じ状況にあります。 VC4がポートレートのみで、VC3(横向き)からプッシュしようとすると、VC4も横向きに表示されるとします。 supportedInterfaceOrientations機能は、私がhttps://stackoverflow.com/a/15057537/6257992を「ハック」が見つかりあなたの問題VC3 => VC1(私はIOS 7メソッドを使用します)

を解決するために...

を呼び出していないように見えます私はあなたと同じ実装を持っています。

  1. はNavigationController
  2. はVC1のあなたのViewWillAppearへのリンクにコードを追加し、「まともな」アニメーション用のブランク1 でのUIViewControllerを置き換えるカスタムで定義された2つのメソッドをオーバーライドBlankViewControllerを作成します。

    • PopToRootViewController =真
    • PresentViewController = falseを
    • DismissViewController = T RUE

PS:アニメーションは、シミュレータに比べて携帯電話上で良く見えます。

あなたがより良い方法を見つけたり、備考がある場合は、どうか共有してください。

関連する問題