を使用して回転:は、私は、次の許可の方向で(ストーリーボードで作成)のViewController階層を持つpopToRootViewController
+---------------+ +------------------+ +------------------+
+ VC1 + + VC2 + + VC3 +
+ + -> + + -> + +
+ Portrait Only + + All orientations + + All orientations +
+---------------+ +------------------+ +------------------+
許さ回転は、これらすべてのViewControllersのsupportedInterfaceOrientations
とshouldAutorotate
方法に従って作業を行うようにするためには
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がすべての方向をサポートしているので)画面を回転し、ルートビューコントローラにポップ。私は、次のデバッグトレースを得た:
supportedInterfaceOrientations
方法は(ライン0と1で)VC1のために呼ばれ、したがって、システムは、それが適切にVC1を表示するために回転する必要が知ることができる:回転作品良い。
VC3がランドスケープモードの間にpopToRootViewControllerAnimated
を使用してVC3からVC1にポップしようとすると問題が発生します。このケースは、サーバーへの接続が失われたときに発生するため、ルートビューコントローラーに戻る必要があります。 supportedInterfaceOrientations
が呼び出されていないので(VC1とVC2のどちらも)、VC1はランドスケープで表示されているので、前のトレースを取得できません。
VC3からVC1に直接ポップして、正しい向きで表示させるにはどうすればよいですか?私はVC3からVC2へ、次にVC2からVC1へポップできることを知っていますが、可能であればVC3からVC1に直接行きたいと思います。
私はそれが可能ではないと思います。私が回転を強制することができたと感じる唯一の時間は、モーダルを表示しなくてもそれを却下することです。私はあなたがVC1の上にナビゲーションコントローラを表示し、その後VC1に戻ってみたいと思ったら、それを却下してカスタムアニメーションを作って、右からプッシュされているか、左からポップされているように見えるかと思います。しかし、優れたソリューションがあれば:3 –