Iphone iOS 7后退按钮弹出手势

Iphone iOS 7后退按钮弹出手势,iphone,ios,objective-c,uinavigationcontroller,Iphone,Ios,Objective C,Uinavigationcontroller,在iOS 7中,有一个新的滑动到弹出的手势:在屏幕的左侧从左向右滑动,UINavigationController弹出到以前的UIViewController 当我创建这样的自定义后退按钮时,滑动到弹出的手势不再起作用: UIBarButtonItem *customBackButton = [[UIBarButtonItem alloc] initWithTitle:@" " style:UIBarButtonItemStyleBordered target:self action:@sele

在iOS 7中,有一个新的滑动到弹出的手势:在屏幕的左侧从左向右滑动,UINavigationController弹出到以前的UIViewController

当我创建这样的自定义后退按钮时,滑动到弹出的手势不再起作用:

UIBarButtonItem *customBackButton = [[UIBarButtonItem alloc] initWithTitle:@" " style:UIBarButtonItemStyleBordered target:self action:@selector(navigateBack)];
[customBackButton setBackButtonBackgroundImage:barBackBtnImg forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[customBackButton setBackButtonBackgroundImage:barBackBtnImgHighlighted forBarMetrics:UIBarMetricsDefault];
self.navigationItem.backBarButtonItem = customBackButton;
如何使用自定义后退按钮并使用本机滑动弹出手势

更新:

这就是在navigateBack中发生的情况:


只需添加以下代码行:

[self.navigationController.interactivePopGestureRecognizer addTarget:self action:@selector(handleGesture:)];
您可以添加自己的UIGestureRecognitor并自己弹出UIViewController。有关更多信息,请参阅。

您在“导航回退”中做了什么

使用以下方法:

- (void)navigateBack
{
    [self.navigationController popViewControllerAnimated:YES];
}

有一个新的手势识别器
UIScreenedGepangEstureRecognitor
。您可以将其分别添加到视图和句柄中(调用
导航回退
),复制视图控制器的导航行为。

尝试将其添加到自定义后退按钮中
self.navigationController.interactiveepogesturerecognizer.delegate=(id)self

无需添加自己的手势识别器。UINavigationController已经为您完成了这项工作。 您需要为InteractivePopGetureRecognizer设置委托,然后才能启用它

做以下两件事:

self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self;
[self.navigationController.interactivePopGestureRecognizer setEnabled:YES];
self.navigationController.interactiveepgpgestureerecognizer.delegate=(id)self;
[self.navigationController.interactiveepgpgestureerecognizer setEnabled:YES];
我使用

[[UINavigationBar appearance] setBackIndicatorImage:[UIImage imageNamed:@"nav_back.png"]];
[[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@"nav_back.png"]];

[UIBarButtonItem.appearance setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -64) forBarMetrics:UIBarMetricsDefault];

为了避免崩溃,您必须小心如何添加和删除自定义反向选择器。原因是,当您按下弹出控制器时,导航控制器保持在附近。 正如添加自定义后退按钮+选择器后所述,您应该在viewDidApear中执行以下操作

    if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)])
    {
       self.navigationController.interactivePopGestureRecognizer.enabled = YES;
       self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self;
       [self.navigationController.interactivePopGestureRecognizer addTarget:self action:@selector(navigateBack)];
    }

这些电话的时间安排是一个关键。否则您可能会遇到崩溃,请参阅

中有关原因的更多详细信息是的,这就是navigateBack中的内容。我将把它添加到问题中,谢谢!尝试了这种方式,没有调用操作,但我使用了自定义的后退按钮。当使用标准后退按钮时,此操作调用。这应该是正确答案。我只是用自己的UIScreenedGePangestureRecognitor创建了一个自定义转换并手动操作pop过程。我在这里找到了你的答案,然后说,试试看。与两行代码完美配合。我发现,如果在
UINavigationController
转换过程中开始一个后退动作,这可能会导致一些非常古怪的行为。例如,如果我点击一个按钮,将一个新的控制器推到
UINavigationController
的堆栈上,并立即向后滑动,我会陷入中间状态,导航栏显示好像我在第一个屏幕上(按下,然后弹出),但导航控制器的内容显示第二个屏幕,好像弹出从未发生过。我现在正在使用解决方案码农白腩肚 求婚了,但那还是有点麻烦。我亲眼目睹了这种行为。如果将UINavigationController与UINavigationBar一起使用,则无需使用此代码位。导航栏会自己处理它,你不会陷入这种中间状态。如果你隐藏了导航栏,这也会起作用。非常感谢。非常感谢。节省了很多时间您是否可以使用外观代理定制后退按钮图像?这会导致崩溃:例如,您有VC1(作为根VC)和VC2。从VC1推到VC2,然后弹回来。现在,在VC1上做一个滑动手势,然后立即再次按下VC2。对我来说,结果是崩溃。或者你可以在从VC2弹出后在VC1上滑动几次,我的测试应用程序再次崩溃。我必须注意,我在VC1中使用了
NULL
禁用
interactiveepgpesturerecognizer
而不是
@selector(performCompletion)
,这会导致另一个错误。
    if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)])
    {
       self.navigationController.interactivePopGestureRecognizer.enabled = YES;
       self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self;
       [self.navigationController.interactivePopGestureRecognizer addTarget:self action:@selector(navigateBack)];
    }
        if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)])
        {
           [self.navigationController.interactivePopGestureRecognizer removeTarget:self action:@selector(performCompletion)];
        }