自定义导航控制器返回按钮

  • 应用场景需求:在app中,一般给导航控制器push的子控制器的返回按钮统一设置,而不是用系统的默认返回按钮
  • 分析:
    • 1 自定义返回按钮(UIButton)
    • 2 自定义返回按钮后,系统不会给自定义的按钮添加返回功能,需要手动添加方法,实现返回功能
    • 3 自定义返回按钮后,系统也不会给自定义的按钮添加侧滑功能,原因是侧滑手势识别器代理方法系统取消了
  • 解决方案:
    • 1 设置手势交互识别器的代理
    • 2 遵守代理协议
    • 3 实现代理方法
    • 4 重写push方法的目的 : 拦截所有push进来的子控制器在里面自定义全局的返回按钮
#import "OSNaViewController.h"
@interface 
OSNaViewController () <UIGestureRecognizerDelegate>
@end@implementation OSNaViewController
- (void)viewDidLoad { [super viewDidLoad]; // 设置手势识别器的代理 self.interactivePopGestureRecognizer.delegate = self; // 设置导航控制器背景图片 [self.navigationBar setBackgroundImage:[UIImage imageNamed:@"navigationbarBackgroundWhite"] forBarMetrics:UIBarMetricsDefault];}
1. 重写push方法的目的 : 拦截所有push进来的子控制器
 // @param viewController 刚刚push进来的子控制器 
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    if (self.childViewControllers.count > 0) { // 如果viewController不是最早push进来的子控制器
        // 左上角
        UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
        [backButton setImage:[UIImage imageNamed:@"图片名称"] forState:UIControlStateNormal];
        [backButton setImage:[UIImage imageNamed:@"图片名称"] forState:UIControlStateHighlighted];
        [backButton setTitle:@"返回" forState:UIControlStateNormal];
        [backButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        [backButton setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
        [backButton sizeToFit];
        // 这句代码放在sizeToFit后面
        backButton.contentEdgeInsets = UIEdgeInsetsMake(0, -20, 0, 0);
        [backButton addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
        viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];

        // 隐藏底部的工具条
        viewController.hidesBottomBarWhenPushed = YES;
    }
    // 所有设置搞定后, 再push控制器
    [super pushViewController:viewController animated:animated];
}
2. 监听返回按钮的点击
- (void)back
{
    [self popViewControllerAnimated:YES];
}
3. 手势识别器对象会调用这个代理方法来决定手势是否有效
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    // 手势何时有效 : 当导航控制器的子控制器个数 > 1就有效
    return self.childViewControllers.count > 1;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值