具有自定义后退按钮的滑动手势冻结了根视图控制器

San*_*noj 4 uinavigationcontroller ios7

我在我的应用程序中到处都有自定义的后退按钮,看起来导航控制器不喜欢它。

因此,我希望iOS7滑动后退手势能够与我的自定义后退按钮一起使用。搜索并尝试了不同的方法,但似乎没有希望。我能得到的最接近的是http://keighl.com/post/ios7-interactive-pop-gesture-custom-back-button/。但是,现在,当我继续推入并弹出导航堆栈时,一段时间之后,堆栈中的rootViewController停止响应任何触摸。

有什么建议么?

小智 5

像keighl所暗示的那样,对UINavigationController进行子类化是imo的正确方法。但是他缺少对根视图控制器的检查,以免在根视图上执行手势时冻结。这是带有附加检查的修改后的版本:

CBNavigationController.h:

#import <UIKit/UIKit.h>

@interface CBNavigationController : UINavigationController <UIGestureRecognizerDelegate, UINavigationControllerDelegate>
@end
Run Code Online (Sandbox Code Playgroud)

CBNavigationController.m:

#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 AND is not the root view controller
    if (viewController == self.viewControllers.firstObject)
    {
        if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)])
            self.interactivePopGestureRecognizer.enabled = NO;
    }
    else
    {
        if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)])
            self.interactivePopGestureRecognizer.enabled = YES;
    }
}

@end
Run Code Online (Sandbox Code Playgroud)