私のアプリには、さまざまなコントローラーがあります。controller1 をナビゲーション コントローラーに押して、スワイプして戻ると、すべて正常に動作します。しかし、ナビゲーション コントローラー 1 を押し、コントローラー 1 にコントローラー 2 を押して、スワイプして戻そうとすると、アプリケーションがフリーズします。戻るボタンで戻ると、すべて正常に動作します。
どうすれば問題をキャッチできますか?
私のアプリには、さまざまなコントローラーがあります。controller1 をナビゲーション コントローラーに押して、スワイプして戻ると、すべて正常に動作します。しかし、ナビゲーション コントローラー 1 を押し、コントローラー 1 にコントローラー 2 を押して、スワイプして戻そうとすると、アプリケーションがフリーズします。戻るボタンで戻ると、すべて正常に動作します。
どうすれば問題をキャッチできますか?
スワイプしてポップするジェスチャーを使用すると、インターフェイスがフリーズするという同様の問題がありました。私の場合、問題は controller1.viewDidAppear にあり、スワイプジェスチャーを無効にしていました: self.navigationController.interactivePopGestureRecognizer.enabled = NO
. そのため、ユーザーが contorller2 からスワイプバックを開始すると、controller1.viewDidAppear がトリガーされ、ジェスチャが無効になりました。
ジェスチャ認識機能を無効にする代わりに、self.navigationController.interactivePopGestureRecognizer.delegate = self
controller1 に設定して を実装することで、これを解決しました。gestureRecognizerShouldBegin:
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)] &&
gestureRecognizer == self.navigationController.interactivePopGestureRecognizer) {
return NO;
}
return YES;
}
私の解決策は、デリゲートをナビゲーション コントローラーに追加することでした。次に、ルート ビュー コントローラーでのみポップ ジェスチャ認識機能を無効にします。YMMV。
#pragma mark - UINavigationControllerDelegate
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
BOOL isRootVC = viewController == navigationController.viewControllers.firstObject;
navigationController.interactivePopGestureRecognizer.enabled = !isRootVC;
}
スウィフト 4:
デリゲートを設定し、
self.navigationController?.interactivePopGestureRecognizer?.delegate = self
デリゲート メソッドを実装し、
extension YourVC: UIGestureRecognizerDelegate{
func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
if gestureRecognizer == self.navigationController?.interactivePopGestureRecognizer && conditionToDisableTheGesture {
return false
}else{
return true
}
}
}
これを試してみることをお勧めします。これは私にとって完璧に機能します。インタラクティブなスワイプは引き続き楽しめます。
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)] &&
gestureRecognizer == self.navigationController.interactivePopGestureRecognizer) {
if(self.navigationController.viewControllers.count<=1)
{
return NO;
}
}
return YES;
}
私は同じ問題を抱えていて、以下の解決策を見つけました。コントローラーの下に追加
#import <UIKit/UIKit.h>
@interface CBNavigationController : UINavigationController <UIGestureRecognizerDelegate,UINavigationControllerDelegate>
@end
#import "CBNavigationController.h"
@interface CBNavigationController ()
@end
@implementation CBNavigationController
- (void)viewDidLoad
{
NSLog(@"%s",__FUNCTION__);
__weak CBNavigationController *weakSelf = self;
if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)])
{
self.interactivePopGestureRecognizer.delegate = weakSelf;
self.delegate = weakSelf;
}
}
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
NSLog(@"%s",__FUNCTION__);
if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)])
self.interactivePopGestureRecognizer.enabled = NO;
[super pushViewController:viewController animated:animated];
}
#pragma mark UINavigationControllerDelegate
- (void)navigationController:(UINavigationController *)navigationController
didShowViewController:(UIViewController *)viewController
animated:(BOOL)animate
{
NSLog(@"%s",__FUNCTION__);
// Enable the gesture again once the new controller is shown
if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)])
self.interactivePopGestureRecognizer.enabled = YES;
}
@end
以下のリンクを参照できます
http://keighl.com/post/ios7-interactive-pop-gesture-custom-back-button/