APP开发之初:自定义NavigationController,拦截所有push方法.

来源:互联网 发布:软件配置管理计划书 编辑:程序博客网 时间:2024/04/29 20:00

一个项目里面会用无数次导航控制器的Push方法,它们一般都有一些共性的地方需要配置.例如”返回按钮”的字体以及触发的事件,tabBar的背景色. 还有每次Push要隐藏的底部工具条…用自定义的NavigationContoller就不必重复上面的代码配置,方便日后维护修改.降低代码复写

#import "XMGNavigationController.h"@interface XMGNavigationController () <UIGestureRecognizerDelegate>@end@implementation XMGNavigationController- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view.    self.interactivePopGestureRecognizer.delegate = self;    [self.navigationBar setBackgroundImage:[UIImage imageNamed:@"navigationbarBackgroundWhite"] forBarMetrics:UIBarMetricsDefault];}/** *  重写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];}- (void)back{    [self popViewControllerAnimated:YES];}#pragma mark - <UIGestureRecognizerDelegate>/** *  手势识别器对象会调用这个代理方法来决定手势是否有效 * *  @return YES : 手势有效, NO : 手势无效 */- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{    // 手势何时有效 : 当导航控制器的子控制器个数 > 1就有效    return self.childViewControllers.count > 1;}@end
0 0