用分类自定义UIBarButtonItem

原因:

  1. 项目中多次用到自定义UIBarButtonItem,所以需要抽取出来
  2. 代码该干什么就干什么,因为这段代码是自定义。UIBarButtonItem,所以应该由UIBarButtonItem做。所以创建一个分类。
  3. 命名习惯,代码规范。要用[UIBarButtonItem itemWith…]这种形式。

自定义UIBarButtonItem

==UIBarButtonItem+Category.h文件==

1
2
3
4
5
#import <UIKit/UIKit.h>

@interface UIBarButtonItem (Category)
+ (NSArray *)itemWithTarget:(id)target action:(SEL)action image:(NSString *)image lighlightImage:(NSString *)lighlightImage;
@end

==UIBarButtonItem+Category.m文件==

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#import "UIBarButtonItem+Category.h"

@implementation UIBarButtonItem (Category)

/**
* 自定义一个UIBarButtomItem
*
* @param target 点击之后调用哪个对象
* @param action 点击之后调用对象里面的哪个方法
* @param image 普通状态下图片
* @param lighlightImage 高亮状态下图片
*
* @return 创建完的一个UIBarButtomItem数组
*/
+ (NSArray *)itemWithTarget:(id)target action:(SEL)action image:(NSString *)image lighlightImage:(NSString *)lighlightImage {

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setImage:[UIImage imageNamed:image] forState:UIControlStateNormal];
[button setImage:[UIImage imageNamed:lighlightImage] forState:UIControlStateHighlighted];
[button addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];
button.size = button.currentImage.size;

UIBarButtonItem *buttonItem = [[UIBarButtonItem alloc]initWithCustomView:button];
UIBarButtonItem *speaceItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
speaceItem.width = -5;

return @[speaceItem,buttonItem];
}

@end

调用

在ViewController调用或者在自定义的UINavigationController的push方法里面调用。

1
2
3
4
//ViewController调用
self.navigationItem.leftBarButtonItems = [UIBarButtonItem itemWithTarget:self action:@selector(back) image:@"back_icon_red" lighlightImage:@"back_icon_red"];
//自定义UINavigationController的push方法调用
viewController.navigationItem.leftBarButtonItems = [UIBarButtonItem itemWithTarget:self action:@selector(back) image:@"back_icon_red" lighlightImage:@"back_icon_red"];

注意:action方法写在ViewController或自定义UINavigationController里面。

当然还可以在分类里做其他自定义的样式。

–EOF–