web-dev-qa-db-ja.com

2つのView Controllerをプッシュし、2番目のView Controllerのみのトランジションをアニメーション化するにはどうすればよいですか?

Storyboad内に3つのコントローラー(FirstVC、SecondVC、ThirdVC)があり、ナビゲーションはシーケンシャルです:ユーザーはFirstVCからSecondVC、そしてThirdVCにナビゲートできます。ここで、FirstVCからThirdVCを開くボタンを作成する必要がありますが、ナビゲーションスタックにSecondVCも配置するため、ユーザーがThirdVCから戻ると、SecondVCに戻ります。ですから、FirstVCからSecondVCへのアニメーションは必要ありません。NavigationControllerスタックにSecondVCをプッシュし、ThirdVCへの遷移のみをアニメーション化するだけです。

PerformSegueWithIdentifierのアニメーションを無効にする方法が見つからなかったため、ストーリーボードからSecondVCを手動でインスタンス化し、ナビゲーションスタックに配置してから、ThirdVCのperformSegueWithIdentifierを実行する必要があると考えています。それを行う方法はありますか?

46
Centurion

FirstVCを使用している場合に探しているソリューション:

NSMutableArray *controllers = [self.navigationController.viewControllers mutableCopy];
[controllers addObject:secondVc];
[controllers addObject:thirdVC];
[self.navigationController setViewControllers:controllers animated:YES];

これは、secondVCがプロセスで表示されることなく、thirdVCでアニメーション化します。ユーザーが戻るボタンを押すと、secondVcに戻ります

77
KimHafr

View Controllerをプッシュするための標準アニメーションを保持するには、in Swift

let pushVC = UIViewController()
let backVC = UIViewController()

if let navigationController = navigationController {

  navigationController.pushViewController(pushVC, animated: true)

  let stackCount = navigationController.viewControllers.count
  let addIndex = stackCount - 1
  navigationController.viewControllers.insert(backVC, atIndex: addIndex)

}

これは通常pushVCを表示し、backVCをナビゲーションスタックに挿入し、UINavigationControllerのアニメーションと履歴の両方を保持します。

setViewControllersを使用できますが、標準のプッシュアニメーションは失われます。

25
David Smith

KimAMartinsenソリューションのSwiftバージョン

let firstVC = self.storyboard?.instantiateViewController(withIdentifier: "Tests") as! firstViewController

let secondVC = self.storyboard?.instantiateViewController(withIdentifier: "Dashboard") as! SecondViewController

var controllers = self.navigationController?.viewControllers
controllers?.append(firstVC)
controllers?.append(secondVC)
self.navigationController?.setViewControllers(controllers!, animated: true)
6
Salem Binmusaed
extension UINavigationController {
    open func pushViewControllers(_ inViewControllers: [UIViewController], animated: Bool) {
        var stack = self.viewControllers
        stack.append(contentsOf: inViewControllers)
        self.setViewControllers(stack, animated: animated)
    }
}
4
Al Zonke

うーん、おそらくアニメーションを行わないカスタムセグエを書いて、ストーリーボードのセグエがセグエクラスを参照していることを確認してください。

https://developer.Apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomSegues/CreatingCustomSegues.html

上記のリンクを作成方法にリンクすると、ドキュメントIMOはかなり自明です。その後、セグエの動作と表示方法をカスタマイズできます。

他のオプションには、古いデバイスをサポートしたくないと仮定してiOS7で導入された新しいプロトコルが含まれます。

Apple Tech Talks 2014ビデオ「Architecting Modern Apps part 1」をご覧ください。

https://developer.Apple.com/tech-talks/videos/

あなたの質問には多くの解決策がありますが、上記のいずれかが役立つことを願っています。そうでない場合はお知らせください。別のものを提案します。

更新:

別のオプションは、おそらくこれを達成するためにNavigation Controllerをタブの1つに追加するか、必要に応じてタブを交換することができるので、おそらくこれがあなたのニーズに合う場合、Tav View Controllerを使用することです。

2
AppHandwerker

View Controllerを手動でプッシュすることをお勧めします。最初のアニメーションなし:

[self.navigationController pushViewController:SecondVC animated:NO];
[self.navigationController pushViewController:ThirdVC animated:YES];
0
Ortwin Gentz