修改导航控制器返回按钮与全屏返回手势

统一返回按钮

自定义UINavigationController子类:JQNavigationController
拦截- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated方法,在push之前统一修改目标控制器的leftBarButtonItem


JQNavigationController.m

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
    //如果先调用[super pushViewController:viewController animated:animated];
    //会在主界面就隐藏tabBar
    if (self.viewControllers.count > 0 ) {
        //跳转到之后的控制器隐藏tabBar
        viewController.hidesBottomBarWhenPushed = YES;
        //统一设置返回按钮
        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
        [button setImage:[UIImage imageNamed:@"navigationButtonReturn"] forState:UIControlStateNormal];
        [button setTitle:@"返回" forState:UIControlStateNormal];
        [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        [button setContentEdgeInsets:UIEdgeInsetsMake(0, -15, 0, 0)];
        [button addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
        [button sizeToFit];
        UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:button];
        viewController.navigationItem.leftBarButtonItem = item;
    }
    //跳转控制器
    [super pushViewController:viewController animated:animated];
}

- (void)back {
    [self popViewControllerAnimated:YES];
}

全屏返回手势

用上述这种方法修改返回按钮会使系统的滑动返回手势失效,因此我们要自己管理手势比较有效的方法是添加自定义的Pan手势


JQNavigationController.m

- (void)viewDidLoad {
    [super viewDidLoad];
//    target= <(action=handleNavigationTransition:, target=<_UINavigationInteractiveTransition 0x7fd94f60a060>)>>
    //使系统的滑动返回手势不可用
    self.interactivePopGestureRecognizer.enabled = NO;
    //添加全屏滑动返回手势
    [self addPanGesture];
}

- (void)addPanGesture {
    UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self.interactivePopGestureRecognizer.delegate action:@selector(handleNavigationTransition:)];
    [self.view addGestureRecognizer:panGesture];
    panGesture.delegate = self;
}

注意:
self.interactivePopGestureRecognizer.delegate是系统原先处理返回手势的代理
handleNavigationTransition:是系统原先处理返回手势的实现,在这里利用系统的实现就不用自行实现手势返回


这样添加手势之后会有小bug,就是在导航控制器的根视图控制器滑动返回时,会造成假死,解决方法:不处理在视图控制器的滑动手势返回

#pragma mark - UIGestureRecognizerDelegate
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    //不让导航控制器在根视图控制器滑动返回
    return self.childViewControllers.count > 1;
}

#pragma mark - end

以上
自定义这样的一个类就可以实现开发常用的统一返回按钮与全屏滑动返回

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AI阅读 16,043评论 3 119
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,225评论 4 61
  • 情字牵扯了太多太多,今晚某人快出去工作了,非找我出去玩不可。我们之间不是爱情,又比友情更深一层。很多人以为我们...
    阿边边边010阅读 903评论 0 0
  • 咀嚼着腌渍的略咸的辣白菜 惆怅的南方姑娘伫立在铁窗前 看着淅淅沥沥的雨夹着雾霾袭来 这深秋的湿冷我真的很讨厌 山上...
    整个宇宙我最帅阅读 1,150评论 0 1
  • 帆布伞的骨骼,撑起了一处可以遮阳的素食店,而我,也刚好坐于其中。 倒影在水池中的房梁,一架塑料制的玩具飞机,搁浅在...
    小曼的岛阅读 3,902评论 11 19