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