2.1 - 设置导航栏
2.1.2 - 封装UIBarButtonItem的,通过其分类来创建一个类方法,以快速设置导航栏上的Item
+(instancetype)itemWithImage:(NSString *)image highimage:(NSString *)highimage target:(id)target action:(SEL)action { UIButton *Btn = [[UIButton alloc]init]; [Btn setBackgroundImage:[UIImage imageNamed:image] forState:UIControlStateNormal]; [Btn setBackgroundImage:[UIImage imageNamed:highimage] forState:UIControlStateHighlighted]; [Btn addTarget:target action:action forControlEvents:UIControlEventTouchUpInside]; Btn.size = Btn.currentBackgroundImage.size; return [[self alloc]initWithCustomView:Btn]; }
2.2 - 自定义导航栏控制器,要改变当控制器被push时,返回键为自定义返回键
/** * 可以在这个方法中拦截所有push进来的控制器 */ - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated { if (self.childViewControllers.count > 0) {// 如果push进来的不是第一个控制器 UIButton *backBtn = [UIButton buttonWithType:UIButtonTypeCustom]; [backBtn setTitle:@"返回" forState:UIControlStateNormal]; [backBtn setImage:[UIImage imageNamed:@"navigationButtonReturn"] forState:UIControlStateNormal]; [backBtn setImage:[UIImage imageNamed:@"navigationButtonReturnClick"] forState:UIControlStateHighlighted]; backBtn.size = CGSizeMake(70, 30); // 让按钮内部的所有内容左对齐 backBtn.contentEdgeInsets = UIEdgeInsetsMake(0, -50, 0, 0); [backBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; [backBtn setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted]; [backBtn addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside]; viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithCustomView:backBtn]; // 隐藏tabbar viewController.hidesBottomBarWhenPushed = YES; } // 这句super的push要放在后面,让view controller可以覆盖在上面leftbarbuttonitem [super pushViewController:viewController animated:animated]; }
为了实现当有push进来一个新的控制器进来时,返回键不是系统自定义的蓝色控制器,就得在自定义导航控制器中重写push的方法,以此来达到拦截Push的过程。
2.2.2 - 设置导航栏的背景色,该项目采用的是图片
/** * 当第一次使用这个类的时候会调用一次 */ + (void)initialize { // 当导航栏用在XMGNavigationController中, appearance设置才会生效 // UINavigationBar *bar = [UINavigationBar appearanceWhenContainedIn:[self class], nil]; // 视情况而定 UINavigationBar *bar = [UINavigationBar appearance]; [bar setBackgroundImage:[UIImage imageNamed:@"navigationbarBackgroundWhite"] forBarMetrics:UIBarMetricsDefault]; }
在这里面设置的原因,是因为如果在viewDidload中写的话,就会调用四次,而这里面写就自会调用一次,优化性能。
原文:http://www.cnblogs.com/zw-ios/p/5249517.html