自定义一个NavigationController, 一般可以自定义的部分包括三大类:
- UI设置方面
- 返回键按钮的相关设置
#import "QMNavigationController.h"
@implementation QMNavigationController
//当第一次使用这个类的时候调用一次
+ (void)initialize
{
/**设置导航控制器背景图片的另一种方法
[self.navigationBar setBackgroundImage:[UIImage imageNamed:@"navigationbarBackgroundWhite"] forBarMetrics:UIBarMetricsDefault];
*/
/**设置navigationBar的item的颜色(title 和 按钮的title)
self.navigationBar.tintColor = [UIColor blackColor];
*/
//当你UINavigationBar包含在这个QMNavigationController里面才会更换背景图片, 使用其他NavigationController不会设置该背景图片, 比如UINavigationController
UINavigationBar *bar = [UINavigationBar appearanceWhenContainedIn:[self class], nil];
[bar setBackgroundImage:[UIImage imageNamed:@"navigationbarBackgroundWhite"] forBarMetrics:UIBarMetricsDefault];
}
- (void)viewDidLoad
{
[super viewDidLoad];
}
//拦截push操作, 做一些设置
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
if ([self childViewControllers].count > 0) { //如果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 addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
//根据内容自动设置bounds
[backButton sizeToFit];
//不在Inset里面的内容会被切掉, 左边-20 可以离导航栏边界更近一点, 优化视觉感受
backButton.contentEdgeInsets = UIEdgeInsetsMake(0, -20, 0, 0);
/**按钮布局技巧, 可以让按钮内部的所有内容左对齐(contentHorizontalAlignment: 内容水平对齐属性)
backButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
*/
viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
//隐藏底部tabbar
viewController.hidesBottomBarWhenPushed = YES;
}
//如果自己想再修改左上角的leftBarButtonItem, 可以覆盖掉之前的leftBarButtonItem(必须写后面)
[super pushViewController:viewController animated:animated];
}
//返回按钮的方法
- (void)back
{
[self popViewControllerAnimated:YES];
}