Iphone iOS 7后退按钮弹出手势
在iOS 7中,有一个新的滑动到弹出的手势:在屏幕的左侧从左向右滑动,UINavigationController弹出到以前的UIViewController 当我创建这样的自定义后退按钮时,滑动到弹出的手势不再起作用: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
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)];
}