iOS覆盖系统返回按钮后,滑动返回功能

这里写图片描述

在开发中,我们一般会覆盖系统默认的导航栏上的返回按钮(修改按钮颜色和文字)。
具体做法如下:

        // 创建按钮
        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
        [button setTitle:@"返回" forState:UIControlStateNormal];
        [button setImage:[UIImage imageNamed:@"navigationButtonReturn"] forState:UIControlStateNormal];
        [button setImage:[UIImage imageNamed:@"navigationButtonReturnClick"] forState:UIControlStateHighlighted];
        // 按钮自适应
        [button sizeToFit];

        // 让按钮的内容往左边偏移10
        button.contentEdgeInsets = UIEdgeInsetsMake(0, -10, 0, 0);
        [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        [button setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];

        // 添加监听方法
        [button addTarget:self action:@selector(backClick) forControlEvents:UIControlEventTouchUpInside];

        // 修改导航栏左边的item
        viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button];

创建一个UIButton,给这个按钮设置图片和标题,然后修改为UIBarButtonItem

这里写图片描述

这样这个返回按钮就变成了我们想要的样子。
但是这种做法也伴随着一个问题:原本iOS系统的滑动返回功能失效了。
这里写图片描述
(只能点击 “返回按钮” 返回)

解决:
这个问题的根本是手势失效了。
可能1:手势被清空了

// self是我们自定义的导航控制器
NSLog(@"%@",self.interactivePopGestureRecognizer);

打印结果有手势,手势被清空的可能被排除:

<UIScreenEdgePanGestureRecognizer: 0x7fec5a7198a0; state = Possible; delaysTouchesBegan = YES; view = <UILayoutContainerView 0x7fec5a709080>; target= <(action=handleNavigationTransition:, target=<_UINavigationInteractiveTransition 0x7fec5a727ae0>)>>

可能2:手势代理做了一些事情,导致手势失效
1、控制器时态加载完成设置interactivePopGestureRecognizer的代理为控制本身

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    // 手势代理
    self.interactivePopGestureRecognizer.delegate = self;
}

2、当然在@interface就要继承代理协议了

@interface NavigationController () <UIGestureRecognizerDelegate>

@end

3、实现相关代理方法

#pragma mark - <UIGestureRecognizerDelegate>
/**
 决定是否触发手势
 */
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    // 排除根控制器,其他所有子控制器都要触发手势
    return self.childViewControllers.count > 1;
}

这里写图片描述
(这样iOS 7后系统默认的滑动返回功能也有了)

最后贴一下我们这个自定义导航控制的代码:

//
//  NavigationController.m


#import "NavigationController.h"

@interface NavigationController () <UIGestureRecognizerDelegate>

@end

@implementation NavigationController

+ (void)load
{
    UINavigationBar *navBar = [UINavigationBar appearanceWhenContainedIn:self, nil];
    [navBar setBackgroundImage:[UIImage imageNamed:@"navigationbarBackgroundWhite"] forBarMetrics:UIBarMetricsDefault];
}

#pragma mark - <UIGestureRecognizerDelegate>
/**
 决定是否触发手势
 */
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    // 排除根控制器,其他所有子控制器都要触发手势
    return self.childViewControllers.count > 1;
}


- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    // 手势代理
    self.interactivePopGestureRecognizer.delegate = self;
}


 /**
  重写导航控制器的push方法
  */
 - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    // 在push之前,统一设计返回按钮
    // 只有非根控制才需要设置
    if (self.childViewControllers.count > 0) {

        // 创建按钮
        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
        [button setTitle:@"返回" forState:UIControlStateNormal];
        [button setImage:[UIImage imageNamed:@"navigationButtonReturn"] forState:UIControlStateNormal];
        [button setImage:[UIImage imageNamed:@"navigationButtonReturnClick"] forState:UIControlStateHighlighted];
        // 按钮自适应
        [button sizeToFit];

        // 让按钮的内容往左边偏移10
        button.contentEdgeInsets = UIEdgeInsetsMake(0, -10, 0, 0);
        [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        [button setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];

        // 添加监听方法
        [button addTarget:self action:@selector(backClick) forControlEvents:UIControlEventTouchUpInside];

        // 修改导航栏左边的item
        viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button];

        // 隐藏tabbar
        viewController.hidesBottomBarWhenPushed = YES;
    }

    // 跳转
    // 调用父类
    [super pushViewController:viewController animated:animated];
}

- (void)backClick
{
    // 导航控制器返回
    [self popViewControllerAnimated:YES];
}

@end
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值