0%

用分类自定义UIBarButtonItem

原因:

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

自定义UIBarButtonItem

UIBarButtonItem+Category.h文件

#import <UIKit/UIKit.h>

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

UIBarButtonItem+Category.m文件

#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方法里面调用。

//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–