16

在 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中发生的事情:

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

7 回答 7

35

无需添加您自己的手势识别器。UINavigationController 已经为您做到了。您需要在启用之前为 interactivePopGestureRecognizer 设置委托。

做以下两件事:

self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self;
[self.navigationController.interactivePopGestureRecognizer setEnabled:YES];
于 2013-10-11T07:12:20.310 回答
13

只需添加以下代码行:

[self.navigationController.interactivePopGestureRecognizer addTarget:self action:@selector(handleGesture:)];

您可以添加自己的UIGestureRecognizer并自己弹出UIViewController。有关更多信息,请参阅文档

于 2013-09-18T15:16:15.367 回答
3

我用

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

[UIBarButtonItem.appearance setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -64) forBarMetrics:UIBarMetricsDefault];
于 2013-11-05T08:13:22.133 回答
2

为避免崩溃,您必须小心添加和删除自定义后退选择器的方式。原因是导航控制器在您按下弹出控制器时会一直存在。正如在添加自定义后退按钮+选择器后所述,您应该在 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)];
    }

然后在 viewWillDisapear 中做

        if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)])
        {
           [self.navigationController.interactivePopGestureRecognizer removeTarget:self action:@selector(performCompletion)];
        }

这些调用的时机是关键。否则您可能会遇到崩溃,请在此处查看有关原因的更多详细信息

于 2014-05-13T16:26:37.303 回答
1

有一个新的手势识别器UIScreenEdgePanGestureRecognizer。您可以将其添加到您的视图并分别处理(调用navigateBack),复制视图控制器的导航行为。

于 2013-09-26T16:30:50.630 回答
0

你在“navigateBack”中做了什么?

像这样使用这个方法:

- (void)navigateBack
{
    [self.navigationController popViewControllerAnimated:YES];
}
于 2013-09-18T15:18:34.737 回答
0

尝试将此添加到自定义后退按钮 self.navigationController.interactivePopGestureRecognizer.delegate = (id)self;

于 2013-09-29T23:07:12.207 回答