iOS-自定义导航栏后侧滑返回功能失效

转载 2016年08月30日 16:00:31

iPhone有一个回退按钮在所有的导航条上.这是一个简单的没有文字箭头.
在一开始写项目的时候,就要做好一个准备,导航栏是自定义还是使用系统的,后期有什么改动,有什么比较特殊的需求、当然这些在更改需求的同时,很多东西都已经被改得面目全非了。
完全自定义导航栏,在实际开发中,并不能满足特殊需求,因此更多情况下,还是需要配合系统导航栏自定义,从而达到我们想要的效果。当我们自定义返回按钮之后,就会出现系统的右滑Pop功能就失效了,这是其中的一个小问题,下面就跟大家分享一下我所了解到的:
实现一个自定义按钮是简单的.类似这个设置controller 的navigationItem一个leftBarButtonItem.

- (void)viewDidLoad
{
    self.navigationItem.leftBarButtonItem = [self backButton];
}
- (UIBarButtonItem *)backButton
{
UIImage *image = [UIImage imageNamed:@"back_button"];
 CGRect buttonFrame = CGRectMake(0, 0, image.size.width, image.size.height);

UIButton *button = [[UIButton alloc] initWithFrame:buttonFrame];
[button addTarget:self action:@selector(backButtonPressed)  forControlEvents:UIControlEventTouchUpInside];
 [button setImage:[UIImage imageNamed:normalImage] forState:UIControlStateNormal];

 UIBarButtonItem *item; = [[UIBarButtonItem alloc] initWithCustomView:button];

return item;
}

但是这样在iOS7上 pop手势交互就不好使了.解决方案是简单的让NavigationController自己成为响应的接受者.最好用一个UINavigationController的子类.
@interface CBNavigationController : UINavigationController
@end

@implementation CBNavigationController

- (void)viewDidLoad
{
__weak CBNavigationController *weakSelf = self;

if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)])
{
 self.interactivePopGestureRecognizer.delegate = weakSelf;
 }
}

@end

在转场/过渡的时候禁用 interactivePopGestureRecognizer当用户在转场的时候触发一个后退手势,则各种事件又凑一块了.导航栈内又成了混乱的.我的解决办法是,转场效果的过程中禁用手势识别,当新的视图控制器加载完成后再启用.再次建议使用UINavigationController的子类操作

@interface CBNavigationController :         UINavigationController<UINavigationControllerDelegate, UIGestureRecognizerDelegate>
@end

@implementation CBNavigationController

- (void)viewDidLoad
{
 __weak CBNavigationController *weakSelf = self;

 if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)])
 {
  self.interactivePopGestureRecognizer.delegate = weakSelf;
 self.delegate = weakSelf;
 }
}

// Hijack the push method to disable the gesture

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
 if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)])
   self.interactivePopGestureRecognizer.enabled = NO;

[super pushViewController:viewController animated:animated];
}

#pragma mark UINavigationControllerDelegate

- (void)navigationController:(UINavigationController *)navigationController
   didShowViewController:(UIViewController *)viewController
                animated:(BOOL)animate
{
// Enable the gesture again once the new controller is shown

 if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)])
    self.interactivePopGestureRecognizer.enabled = YES;
}


@end

解决左滑手势冲突和不灵敏的问题

-(UIViewController *)popViewControllerAnimated:(BOOL)animated {

return [super popViewControllerAnimated:YES];
}

#pragma mark UINavigationControllerDelegate
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
if ([self.childViewControllers count] == 1) {
    return NO;
}
return YES;

}

// 我们差不多能猜到是因为手势冲突导致的,那我们就先让 ViewController 同时接受多个手势吧。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}

//运行试一试,两个问题同时解决,不过又发现了新问题,手指在滑动的时候,被 pop 的 ViewController 中的 UIScrollView 会跟着一起滚动,这个效果看起来就很怪(知乎日报现在就是这样的效果),而且也不是原始的滑动返回应有的效果,那么就让我们继续用代码来解决吧

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return [gestureRecognizer isKindOfClass:UIScreenEdgePanGestureRecognizer.class];
}

-(UIViewController *)popViewControllerAnimated:(BOOL)animated {

     return [super popViewControllerAnimated:YES];
}

#pragma mark UINavigationControllerDelegate
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
 if ([self.childViewControllers count] == 1) {
     return NO;
 }
 return YES;
}

// 我们差不多能猜到是因为手势冲突导致的,那我们就先让 ViewController 同时接受多个手势吧。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}

//运行试一试,两个问题同时解决,不过又发现了新问题,手指在滑动的时候,被 pop 的 ViewController 中的 UIScrollView 会跟着一起滚动,这个效果看起来就很怪(知乎日报现在就是这样的效果),而且也不是原始的滑动返回应有的效果,那么就让我们继续用代码来解决吧

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
     return [gestureRecognizer isKindOfClass:UIScreenEdgePanGestureRecognizer.class];
}

iOS-自定义导航栏后侧滑返回功能失效

2016-03-17 iOS开发 文/煜寒了(简书作者) 原文链接:http://www.jianshu.com/p/349636eb3fca iPhone有一个回退按钮在所有的导航条上.这是一...

iOS-自定义导航栏后侧滑返回功能失效

iOS-自定义导航栏后侧滑返回功能失效 时间 2016-03-16 21:30:21  程序员头条 原文  http://www.iswifting.com/2016/03/16/ios-self...

iOS开发之自定义导航栏返回按钮右滑返回手势失效的解决

什么时候会被拦截 当我们使用代码或者用storyboard来创建一个新的控制器的时候~我们很少注意导航栏的leftItem~因为正常情况下~push到下一个界面的leftItem就是上一个界面的sel...
  • hxpp777
  • hxpp777
  • 2016年08月03日 11:44
  • 1459

iOS开发之自定义导航栏返回按钮右滑返回手势失效的解决

iOS开发之自定义导航栏返回按钮右滑返回手势失效的解决 字数1067 阅读3329 评论14 喜欢11 前言 先扯一会儿犊子 本文简介 见题知意 不再加以解释 ...

自定义导航栏返回按钮右滑返回手势失效等问题

完全自定义导航栏,在实际开发中,并不能满足特殊需求,因此更多情况下,还是需要配合系统导航栏自定义,从而达到我们想要的效果。当我们自定义返回按钮之后,就会出现系统的右滑Pop功能就失效了,这是其中的一个...

iOS自定义导航栏库

  • 2017年09月26日 14:41
  • 26.41MB
  • 下载

iOS自定义导航控制器侧滑返回的多种实现方法

*我们都知道,iOS7导航控制器默认自带了侧滑功能,当用户在界面的左边滑动的时候,就会有侧滑功能。 但是如果我们从从导航控制器的返回按钮,就发现系统所带的侧滑返回功能无法使用。因此为了解决此问题,有...

iOS自定义导航控制器侧滑返回的多种实现方法

我们皆晓得,iOS7导航操纵器默许自带了侧滑功效,当用户正在界里的左侧滑动的时间,便会有侧滑功效。 然则若是我们从从导航操纵器的返回按钮,便发明体系所带的侧滑返回功效没法]  *我们都知...

iOS 7+自定义导航栏背景,标题和返回按钮文字颜色

在iOS7下,默认导航栏背景,颜色是这样的,接下来我们就进行自定义,如果你仅仅是更改一下背景和颜色,代码会很简单,不需要很复杂的自定义View来替代leftBarItem  ...

自定义iOS7导航栏背景,标题和返回按钮文字颜色

UIBarButtonItemnavigationItembackBarButtonItemNavigationBar更改导航栏背景 目录(?)[-] 更改导航栏的背景和文字Col...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS-自定义导航栏后侧滑返回功能失效
举报原因:
原因补充:

(最多只允许输入30个字)