スタックに最大 4 つのViewControllerを持つUINavigationControllerのサブクラスがあります。それらを firstVC ... fourVC と呼びましょう。私の NavController は VC 間のカスタム トランジションを実行でき、ios7/8 のバック ジェスチャは、現在どの VC がスタックの一番上にあるかに応じて無効化および有効化されるはずです。ルート VC (firstVC) を NavController のデリゲートとして設定し、デリゲートのメソッドでバック ジェスチャを有効/無効にしようとしています。
-(void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
if ([viewController respondsToSelector:@selector(needsBackGestureEnabled)]) {
[self.navigationController.interactivePopGestureRecognizer setEnabled:YES];
NSLog(@"Back gesture enabled");
self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self;
} else {
if ([navigationController.interactivePopGestureRecognizer isEnabled]) {
[self.navigationController.interactivePopGestureRecognizer setEnabled:NO];
NSLog(@"Back gesture disabled");
self.navigationController.interactivePopGestureRecognizer.delegate = nil;
}
}
}
1つの不具合を除いて、それは魅力のように機能します. 短いスキームが状況をよりよく説明するかもしれないと思います:
FirstVC -[CustomTran]-> SecondVC -[push]-> ThirdVC -[push]-> FourthVC
-needsBackGestureEnabledセレクターを持つのは FourthVC だけですが、2 番目から 3 番目のバック ジェスチャに移行すると、それ自体で有効になります。戻るボタンは CustomBarButtonItem に置き換えられますが。デフォルトの -pushViewControllerアニメーションを実行すると、何とかバックジェスチャが有効になるような気がします。-pushViewController の NavController サブクラスで明示的に無効にしようとしましたが、何も変わりませんでした。なぜこれが起こっているのか、これを修正する方法はありますか?