- 應(yīng)用場景需求:在app中,一般給導(dǎo)航控制器push的子控制器的返回按鈕統(tǒng)一設(shè)置,而不是用系統(tǒng)的默認(rèn)返回按鈕
- 分析:
- 1 自定義返回按鈕(UIButton)
- 2 自定義返回按鈕后,系統(tǒng)不會給自定義的按鈕添加返回功能,需要手動添加方法,實現(xiàn)返回功能
- 3 自定義返回按鈕后,系統(tǒng)也不會給自定義的按鈕添加側(cè)滑功能,原因是側(cè)滑手勢識別器代理方法系統(tǒng)取消了
- 解決方案:
- 1 設(shè)置手勢交互識別器的代理
- 2 遵守代理協(xié)議
- 3 實現(xiàn)代理方法
- 4 重寫push方法的目的 : 攔截所有push進來的子控制器在里面自定義全局的返回按鈕
#import "DXNavigationController.h"
@interface DXNavigationController () <UIGestureRecognizerDelegate>
@end
@implementation DXNavigationController
- (void)viewDidLoad {
[super viewDidLoad];
// 設(shè)置手勢識別器的代理
self.interactivePopGestureRecognizer.delegate = self;
// 設(shè)置導(dǎo)航控制器背景圖片
[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;
}
// 所有設(shè)置搞定后, 再push控制器
[super pushViewController:viewController animated:animated];
}
```
####2. 監(jiān)聽返回按鈕的點擊
```objc
- (void)back
{
[self popViewControllerAnimated:YES];
}
```
####3. 手勢識別器對象會調(diào)用這個代理方法來決定手勢是否有效
```objc
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
// 手勢何時有效 : 當(dāng)導(dǎo)航控制器的子控制器個數(shù) > 1就有效
return self.childViewControllers.count > 1;
}
```
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。