- 应用场景需求:在app中,一般给导航控制器push的子控制器的返回按钮统一设置,而不是用系统的默认返回按钮
- 分析:
- 1 自定义返回按钮(UIButton)
- 2 自定义返回按钮后,系统不会给自定义的按钮添加返回功能,需要手动添加方法,实现返回功能
- 3 自定义返回按钮后,系统也不会给自定义的按钮添加侧滑功能,原因是侧滑手势识别器代理方法系统取消了
- 解决方案:
- 1 设置手势交互识别器的代理
- 2 遵守代理协议
- 3 实现代理方法
- 4 重写push方法的目的 : 拦截所有push进来的子控制器在里面自定义全局的返回按钮
#import "DXNavigationController.h"
@interface DXNavigationController () <UIGestureRecognizerDelegate>
@end
@implementation DXNavigationController
- (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:@"navigationButtonReturn"] forState:UIControlStateNormal];
[backButton setImage:[UIImage imageNamed:@"navigationButtonReturnClick"] 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. 监听返回按钮的点击
```objc
- (void)back
{
[self popViewControllerAnimated:YES];
}
```
####3. 手势识别器对象会调用这个代理方法来决定手势是否有效
```objc
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
// 手势何时有效 : 当导航控制器的子控制器个数 > 1就有效
return self.childViewControllers.count > 1;
}
```