UINavigationController类别具有自定义后退按钮的弹出手势

时间:2013-12-03 21:30:20

标签: ios iphone objective-c uinavigationcontroller objective-c-category

我在我正在使用的应用程序的大量位置使用自定义后退按钮,所以我在UINavigationController上有一个类别,它添加了一个pushViewControllerWithBackArrow方法,可以在视图控制器上设置自定义后退箭头,然后推它。但是,我似乎无法使interactivePopGestureRecognizer正常工作。我在堆栈溢出和在线上找到的代码都是子类UINavigationController,或者在推送的视图控制器中设置interactivePopGestureRecognizer

一个解决方案(http://keighl.com/post/ios7-interactive-pop-gesture-custom-back-button/)涉及将此代码添加到UINavigationController子类中的viewDidLoad:

__weak UINavigationController *weakSelf = self;

if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)])
{
    self.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)weakSelf;
}

这是半功能的,但如果我在我的根视图控制器中向后滑动它会锁定UI。这个问题的解决方案涉及子类化UINavigationController并重写pushViewController和didShowViewController,我想避免。

有没有办法让手势识别器在UINavigationController类别上工作?

1 个答案:

答案 0 :(得分:0)

最好的解决方案是为UIViewController创建一个类别,以便您可以在整个项目中使用它,如下所示。您也可以只复制方法customizeBackButton的代码并将其放在您需要的任何视图控制器中

//UIViewController+Back.h
#import <UIKit/UIKit.h>

@interface UIViewController (Back)

- (void)customizeBackButton;


@end

实施此方法

//UIViewController+Back.m
#import "UIViewController+Back.h"

@implementation UIViewController (BackButton)
- (void)customizeBackButton
{
    UIImage *backButtonImage = [UIImage imageNamed:@"back.png"];
    UIBarButtonItem *customItem = [[UIBarButtonItem alloc] initWithImage:backButtonImage style:UIBarButtonItemStylePlain target:self.navigationController action:@selector(popViewControllerAnimated:)];
    self.navigationItem.hidesBackButton = YES;
    [self.navigationItem setLeftBarButtonItem: customItem];
}
@end

请注意,您必须使用self.navigation.hidesBackButton隐藏原始后退按钮,否则它们都会显示出来。 然后,在任何需要的地方使用它!

-(void) viewWillAppear:(BOOL)animated {
    [self customizeBackButton];
}