iOS 7后退按钮弹出手势

时间:2013-09-18 15:15:32

标签: iphone ios objective-c uinavigationcontroller

在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];
}

7 个答案:

答案 0 :(得分:35)

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

做以下两件事:

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

答案 1 :(得分:13)

只需添加以下代码行:

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

您可以添加自己的 UIGestureRecognizer 并自行弹出 UIViewController 。有关详细信息,请参阅docs

答案 2 :(得分: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];

答案 3 :(得分: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)];
        }

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

中查看有关原因的更多详细信息

答案 4 :(得分:1)

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

答案 5 :(得分:0)

你在“navigateBack”中做了什么?

使用这样的方法:

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

答案 6 :(得分:0)

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