1.自定义导航栏控制器
废话不说直接上代码
#import "ZZYNavigationController.h"
@implementation ZZYNavigationController
/**
* 当第一次使用这个类的时候会调用一次,注意不要用成对象方法---一次性设置一般写在此处
*/
+ (void)initialize
{
//当导航栏用在ZZYNavigationController中,appearance对象的设置才会实现
UINavigationBar * bar = [UINavigationBar appearanceWhenContainedInInstancesOfClasses:@[[self class]]];
[bar setBackgroundImage:[UIImage imageNamed:@"navigationbarBackgroundWhite"] forBarMetrics:UIBarMetricsDefault];
}
- (void)viewDidLoad
{
[super viewDidLoad];
}
//可以再这个方法中拦截所有push进来的控制器
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
//判断一下如果是导航push进去的第一个ViewController,则不需要修改左侧按钮
if(self.childViewControllers.count > 0)//如果push进来的不是第一个控制器
{
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setTitle:@"返回" forState:UIControlStateNormal];
[button setImage:[UIImage imageNamed:@"navigationButtonReturn"] forState:UIControlStateNormal];
[button setImage:[UIImage imageNamed:@"navigationButtonReturnClick"] forState:UIControlStateHighlighted];
button.size = CGSizeMake(70, 30);
// 让按钮内部的所有内容左对齐
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
// [button sizeToFit];
// 让按钮的内容往左边偏移10----否则距离左边会比较远
button.contentEdgeInsets = UIEdgeInsetsMake(0, -10, 0, 0);
[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[button setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
[button addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button];
//隐藏tabBar
viewController.hidesBottomBarWhenPushed = YES;
}
// viewController.navigationItem.backBarButtonItem 修改返回键不能自定义
// 这句super的push要放在后面, 让viewController可以覆盖上面设置的leftBarButtonItem---view创建的时候可以调用viewDidLoad方法重新设置leftBarButtonItem
//注意顺序
[super pushViewController:viewController animated:animated];
}
- (void)back
{
[self popViewControllerAnimated:YES];
}
** 注意:**
- 为什么是使用的 navigationItem.leftBarButtonItem,而不是backBarButtonItem
- 我们要实现的效果是长按返回按钮变色,系统不能实现这种方法,我们需要自定义 Button 。但是 backBarButtonItem 不能够实现自定义的效果,因此我们就要使用navigationItem.leftBarButtonItem
- + (void)initialize 当第一次使用这个类的时候会调用一次,注意该方法是
类方法
,不要用成对象方法----一般一次性设置一般写在此处 - appearanceWhenContainedInInstancesOfClasses 只有当对应的类为 Classes 中的类时设置的 appearance 才能生效
- 需要判断控制器是否为导航栏中的第一个控制器,如果是第一个控制器则不应该设置左侧返回按钮
- leftBarButtonItem 按钮中的内容默认居中,我们需要设置内容左对齐
button.contentHorizontalAlignment 或者 [button sizeToFit]
- 此处不能使用 contentMode 属性进行设置,contentMode 属性一般用于设置 UIView 的对齐属性
- 设置完的按钮距离界面左侧间距会很大,我们需要调整间距的大小,可以通过设置按钮的内边距来实现
button.contentEdgeInsets
- 设置从第一个控制器跳转进去的控制器界面隐藏tabBar
hidesBottomBarWhenPushed
注意设置返回按钮与调用 super push 方法的先后顺序,调用 push 方法的时候会加载控制器的 view 调用 viewDidLoad 方法。
我们应该在设置完返回按钮之后,调用 super push 方法,这样就可以在控制器的 viewDIdLoad 方法中重新设置
leftBarButtonItem
2.封装 UIBarButtonItem 的创建
- 不要创建一个新的 UIBarButtonItem 类,不要增加新的类,否则会增加沟通的成本;完全可以在
系统自带的类的基础
上面进行操作 - 使用分类,给 UIBarButtonItem 做一个分类
#import <UIKit/UIKit.h>
@interface UIBarButtonItem (ZZYExtension)
+ (instancetype)itemWithImage:(NSString *)image highImage:(NSString *)highImage target:(id)target action:(SEL)action;
@end
#import "UIBarButtonItem+ZZYExtension.h"
@implementation UIBarButtonItem (ZZYExtension)
//注意此处必须要传递 target:(id)target ,从来指明目标对象
+ (instancetype)itemWithImage:(NSString *)image highImage:(NSString *)highImage target:(id)target action:(SEL)action
{
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setBackgroundImage:[UIImage imageNamed:image] forState:UIControlStateNormal];
[button setBackgroundImage:[UIImage imageNamed:highImage] forState:UIControlStateHighlighted];
button.size = button.currentBackgroundImage.size;
[button addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];
return [[self alloc] initWithCustomView:button];
}
@end
- 在控制器中创建 UIBarButtonItem
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
//设置导航栏标题
self.navigationItem.titleView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"MainTitle"]];
// 设置导航栏左边的按钮
self.navigationItem.leftBarButtonItem = [UIBarButtonItem itemWithImage:@"MainTagSubIcon" highImage:@"MainTagSubIconClick" target:self action:@selector(tagClick)];
}
- (void)tagClick
{
ZYLogFunc;
}