iOS Tabbar、baseViewController封装及链式编程使用

tabbar.h:

NS_ASSUME_NONNULL_BEGIN
typedef NS_ENUM(NSUInteger, HRTabBarItemStatus) {
    HRTabBarItemStatusSelected, //选中状态
    HRTabBarItemStatusDefault, //默认状态
};

@interface BaseTabbarViewController : UITabBarController
//初始化(控制器名称数组)
- (instancetype)initWithChildControllerNames:(NSArray<NSString *> *)names;

//标签标题
- (void)itemTitles:(NSArray <NSString *>*)titles;
- (BaseTabbarViewController *(^)(NSArray <NSString *>*titles))setupItemTitles;

//标签标题颜色 [统一]
- (void)itemsTitleColor:(UIColor *)color status:(HRTabBarItemStatus)status;
- (BaseTabbarViewController *(^)(UIColor *))setupItemsTitleDefaultColor;
- (BaseTabbarViewController *(^)(UIColor *))setupItemsTitleSelectedColor;

//标签标题颜色 [不统一]
- (void)itemTitleColor:(UIColor *)color atIndex:(NSInteger)idx status:(HRTabBarItemStatus)status;

//去除tabbar顶部黑线
-(void)removeTabbarTopBlackLine;

//设置选中图片
- (BaseTabbarViewController *(^)(NSArray <NSString *>*imageName))setUpSelectImages;

//设置未选中图片
- (BaseTabbarViewController *(^)(NSArray <NSString *>*imageName))setUpUnSelectImages;
@end

NS_ASSUME_NONNULL_END

tabbar.m:

#import "BaseTabbarViewController.h"
#import "RLBaseViewController.h"

@interface BaseTabbarViewController ()

@end

@implementation BaseTabbarViewController

//初始化(控制器名称数组)
- (instancetype)initWithChildControllerNames:(NSArray<NSString *> *)names{
    if (self = [super init]) {
        [self configChildControllerWithNames:names];
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
}

#pragma mark - ---------- Private Methods ----------

//根据名字初始化子视图控制器
- (void)configChildControllerWithNames:(NSArray <NSString *>*)names {
    [self setViewControllers:[self navigationControllersWithStr:names]];
}

- (NSArray *)navigationControllersWithStr:(NSArray <NSString *>*)strArr{
    NSMutableArray *naviVCArr = [NSMutableArray array];
    for (int i = 0; i < strArr.count; i++) {
        Class c = NSClassFromString([strArr objectAtIndex:i]);
        RLBaseViewController *VC = [[c alloc]init];
        UINavigationController *naviVC = [[UINavigationController alloc]initWithRootViewController:VC];
        [naviVCArr addObject:naviVC];
    }
    return naviVCArr;
}

#pragma mark - ---------- Public Methods ----------
//标签标题
- (void)itemTitles:(NSArray <NSString *>*)titles {
    [self.childViewControllers enumerateObjectsUsingBlock:^(__kindof UIViewController * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        obj.tabBarItem.title = titles[idx];
    }];
}
//标签标题(链式)
- (BaseTabbarViewController *(^)(NSArray <NSString *>*titles))setupItemTitles {
    return ^(NSArray <NSString *>*titles) {
        [self.childViewControllers enumerateObjectsUsingBlock:^(__kindof UIViewController * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            obj.tabBarItem.title = titles[idx];
        }];
        return self;
    };
}

- (BaseTabbarViewController *(^)(NSArray <NSString *>*imageName))setUpSelectImages{
    return ^(NSArray <NSString *>*imageNames){
        [self.childViewControllers enumerateObjectsUsingBlock:^(__kindof UIViewController * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            obj.tabBarItem.selectedImage = [UIImage imageNamed:imageNames[idx]];
            [obj.tabBarController.tabBar setSelectedImageTintColor:[UIColor purpleColor]];
        }];
        return self;
    };
}

- (BaseTabbarViewController *(^)(NSArray <NSString *>*imageName))setUpUnSelectImages{
    return ^(NSArray <NSString *>*imageNames){
        [self.childViewControllers enumerateObjectsUsingBlock:^(__kindof UIViewController * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            obj.tabBarItem.image = [UIImage imageNamed:imageNames[idx]];
            [obj.tabBarController.tabBar setUnselectedItemTintColor:[UIColor grayColor]];
        }];
        return self;
    };
}


//标签标题未选中状态颜色
- (void)itemsTitleColor:(UIColor *)color status:(HRTabBarItemStatus)status {
    [self.childViewControllers enumerateObjectsUsingBlock:^(__kindof UIViewController * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        UIControlState state = (status == HRTabBarItemStatusSelected) ? UIControlStateSelected : UIControlStateNormal;
        [obj.tabBarItem setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:color,NSForegroundColorAttributeName, nil] forState:state];
    }];
}

- (BaseTabbarViewController *(^)(UIColor *))setupItemsTitleDefaultColor {
    return ^(UIColor *color) {
        [self.childViewControllers enumerateObjectsUsingBlock:^(__kindof UIViewController * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            [obj.tabBarItem setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:color,NSForegroundColorAttributeName, nil] forState:UIControlStateNormal];
        }];
        return self;
    };
}

- (BaseTabbarViewController *(^)(UIColor *))setupItemsTitleSelectedColor {
    return ^(UIColor *color) {
        [self.childViewControllers enumerateObjectsUsingBlock:^(__kindof UIViewController * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            [obj.tabBarItem setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:color,NSForegroundColorAttributeName, nil] forState:UIControlStateSelected];
        }];
        return self;
    };
}

//标签标题颜色 [不统一]
- (void)itemTitleColor:(UIColor *)color atIndex:(NSInteger)idx status:(HRTabBarItemStatus)status {
    UIViewController *vc = self.childViewControllers[idx];
    UIControlState state = (status == HRTabBarItemStatusDefault) ? UIControlStateNormal : UIControlStateSelected;
    [vc.tabBarItem setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:color,NSForegroundColorAttributeName, nil] forState:state];
}

-(void)removeTabbarTopBlackLine
{
    //方法1
    [UITabBar appearance].clipsToBounds = YES;
    //方法2
    [[UITabBar appearance] setBackgroundColor:[UIColor whiteColor]];
    [[UITabBar appearance] setBarTintColor:[UIColor whiteColor]];
    [[UITabBar appearance] setBackgroundImage:[UIImage imageNamed:@"tabbarImage.png"]];
    [UITabBar appearance].clipsToBounds = YES;
    [[UITabBar appearance] setShadowImage:[UIImage imageNamed:@"tabbarImage.png"]];
}

@end

BaseViewController.h:

#import <UIKit/UIKit.h>
#import "RLBaseViewControllerProtocol.h"
#import "HRBarItem.h"

NS_ASSUME_NONNULL_BEGIN

@interface RLBaseViewController : UIViewController <RLBaseViewControllerProtocol>
#pragma mark 1 导航
@property(nonatomic,copy) NSString *naviTitle;
//设置 标题文本、颜色、字体
- (void)title:(NSString *)naviTitle colcor:(UIColor *)color font:(UIFont *)font;
- (RLBaseViewController *(^)(NSString *title))setUpNaviTitle;
- (RLBaseViewController *(^)(UIColor *))setUpTitleColcor;
- (RLBaseViewController *(^)(UIFont *))setUpTitleFont;

//左按钮标题
- (void)leftItemTitle:(NSString *)title color:(UIColor *)color font:(UIFont *)font action:(void(^)(void))action;
- (RLBaseViewController *(^)(NSString *title, UIColor *color ,UIFont *font,void (^action)(void)))setUpLeftTitleItem;

//左按钮图片:
- (void)leftImageItem:(NSString *)imageName action:(void(^)(void))action;
- (RLBaseViewController *(^)(NSString *imageName,void(^action)(void)))setupLeftImageItem;

//左按钮通用:
- (void)leftItems:(NSArray <HRBarItem *> *)items actions:(void(^)(NSInteger index))actions;
- (RLBaseViewController *(^)(NSArray <UITabBarItem *> *items,void(^action)(void)))setupLeftItems;


//右按钮标题
- (void)rightItemTitle:(NSString *)title color:(UIColor *)color font:(UIFont *)font action:(void(^)(void))action;
- (RLBaseViewController *(^)(NSString *title, UIColor *color ,UIFont *font,void (^action)(void)))setUpRightTitleItem;

//右按钮图片:
- (void)rightImageItem:(NSString *)imageName action:(void(^)(void))action;
- (RLBaseViewController *(^)(NSString *imageName,void(^action)(void)))setupRightImageItem;

//右按钮通用:
- (void)rightItems:(NSArray <HRBarItem *> *)items actions:(void(^)(NSInteger index))actions;
- (RLBaseViewController *(^)(NSArray <HRBarItem *>*items,void (^actions)(NSInteger index)))setupRightItems;

//隐藏系统返回按钮:
@property (nonatomic,assign) BOOL hiddenBackItem;
- (RLBaseViewController *(^)(void))setupHiddenBackItem;



@end

NS_ASSUME_NONNULL_END

BaseViewController.m:

#import "RLBaseViewController.h"


@interface RLBaseViewController ()
//导航标题颜色
@property (strong, nonatomic) UIColor *titleColor;
//导航标题字体
@property (strong, nonatomic) UIFont *titleFont;
//leftItem 点击回调
@property (copy, nonatomic) void(^leftItemActionBlock)(void);
//leftItems 点击回调
@property (copy, nonatomic) void(^leftItemsActionBlock)(NSInteger index);
//rightItem 点击回调
@property (copy, nonatomic) void(^rightItemActionBlock)(void);
//rightItems 点击回调
@property (copy, nonatomic) void(^rightItemsActionBlock)(NSInteger index);
@end

@implementation RLBaseViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self initializeBaseViewControllerData];
    [self configBaseViewControllerControl];
}

- (void)initializeBaseViewControllerData{
    self.titleColor = [UIColor whiteColor];
    self.titleFont = [UIFont systemFontOfSize:17];
}

- (void)configBaseViewControllerControl{
    
}

- (void)setNaviTitle:(NSString *)naviTitle{
    self.navigationItem.title = naviTitle;
}

- (void)title:(NSString *)naviTitle colcor:(UIColor *)color font:(UIFont *)font{
    self.navigationItem.title = naviTitle;
    [self.navigationController.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName:color,NSFontAttributeName:font}];
}

- (RLBaseViewController * _Nonnull (^)(NSString * _Nonnull))setUpNaviTitle{
    return ^(NSString *title){
        self.navigationItem.title = title;
        return self;
    };
}

- (RLBaseViewController * _Nonnull (^)(UIColor * _Nonnull))setUpTitleColcor{
    return ^(UIColor *color){
        self.titleColor = color;
        [self.navigationController.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName:self.titleColor,NSFontAttributeName:self.titleFont}];
        return self;
    };
}

- (RLBaseViewController * _Nonnull (^)(UIFont * _Nonnull))setUpTitleFont{
    return ^(UIFont *font){
        self.titleFont = font;
        [self.navigationController.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName:self.titleColor,NSFontAttributeName:self.titleFont}];
        return self;
    };
}

- (void)leftItemTitle:(NSString *)title color:(UIColor *)color font:(UIFont *)font action:(void (^)(void))action{
    self.leftItemActionBlock = action;
    UIButton *leftBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    [leftBtn setTitle:title forState:UIControlStateNormal];
    [leftBtn setTitleColor:color forState:UIControlStateNormal];
    [leftBtn.titleLabel setFont:font];
    [leftBtn sizeToFit];
    [leftBtn addTarget:self action:@selector(leftitemClick:) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *item = [[UIBarButtonItem alloc]initWithCustomView:leftBtn];
    self.navigationItem.leftBarButtonItem = item;
}

- (void)leftitemClick:(UIButton *)sender{
    if (self.leftItemsActionBlock) {
        self.leftItemsActionBlock(sender.tag);
    }
    if (self.leftItemActionBlock) {
        self.leftItemActionBlock();
    }
}

- (RLBaseViewController * _Nonnull (^)(NSString * _Nonnull, UIColor * _Nonnull, UIFont * _Nonnull, void (^ _Nonnull)(void)))setUpLeftTitleItem{
    return ^(NSString *title,UIColor *color,UIFont *font,void(^action)(void)){
        self.leftItemActionBlock = action;
        UIButton *leftBtn = [UIButton buttonWithType:UIButtonTypeCustom];
        [leftBtn setTitle:title forState:UIControlStateNormal];
        [leftBtn setTitleColor:color forState:UIControlStateNormal];
        [leftBtn.titleLabel setFont:font];
        [leftBtn sizeToFit];
        [leftBtn addTarget:self action:@selector(leftitemClick:) forControlEvents:UIControlEventTouchUpInside];
        UIBarButtonItem *item = [[UIBarButtonItem alloc]initWithCustomView:leftBtn];
        self.navigationItem.leftBarButtonItem = item;
        return self;
    };
}

- (void)leftImageItem:(NSString *)imageName action:(void (^)(void))action{
    self.leftItemActionBlock = action;
    UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithImage:[[UIImage imageNamed:imageName] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]style:UIBarButtonItemStylePlain target:self action:@selector(leftitemClick:)];
    self.navigationItem.leftBarButtonItem = item;
}

- (RLBaseViewController * _Nonnull (^)(NSString * _Nonnull, void (^ _Nonnull)(void)))setupLeftImageItem{
    return ^(NSString *imageName,void(^action)(void)){
        self.leftItemActionBlock = action;
        UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithImage:[[UIImage imageNamed:imageName] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]style:UIBarButtonItemStylePlain target:self action:@selector(leftitemClick:)];
        self.navigationItem.leftBarButtonItem = item;
        return self;
    };
}

- (void)leftItems:(NSArray<HRBarItem *> *)items actions:(void (^)(NSInteger))actions{
    self.leftItemsActionBlock = actions;
    NSMutableArray *barButtonItems = [NSMutableArray array];
    [items enumerateObjectsUsingBlock:^(HRBarItem * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:obj];
        obj.tag = idx;
        [obj addTarget:self action:@selector(leftitemClick:) forControlEvents:UIControlEventTouchUpInside];
        [barButtonItems addObject:item];
        if (obj.frame.size.width == 0) {
            [obj sizeToFit];
        }
    }];
}

- (void)rightItemTitle:(NSString *)title color:(UIColor *)color font:(UIFont *)font action:(void (^)(void))action{
    UIButton *itemButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [itemButton setTitle:title forState:UIControlStateNormal];
    [itemButton setTitleColor:color forState:UIControlStateNormal];
    [itemButton.titleLabel setFont:font];
    [itemButton sizeToFit];
    [itemButton addTarget:self action:@selector(rightItemAction:) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:itemButton];
    self.navigationItem.rightBarButtonItem = item;
}

- (void)rightItemAction:(UIButton *)sender{
    if (self.rightItemActionBlock) {
        self.rightItemActionBlock();
    }
    if (self.rightItemsActionBlock) {
        self.rightItemsActionBlock(sender.tag);
    }
}

- (RLBaseViewController * _Nonnull (^)(NSString * _Nonnull, UIColor * _Nonnull, UIFont * _Nonnull, void (^ _Nonnull)(void)))setUpRightTitleItem{
    return ^(NSString *title, UIColor *color, UIFont *font, void(^action)(void)) {
        self.rightItemActionBlock = action;
        return self;
    };
}

- (void)rightImageItem:(NSString *)imageName action:(void (^)(void))action{
    self.rightItemActionBlock = action;
    UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithImage:[[UIImage imageNamed:imageName] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]style:UIBarButtonItemStylePlain target:self action:@selector(rightItemAction:)];
    self.navigationItem.rightBarButtonItem = item;
}

- (RLBaseViewController * _Nonnull (^)(NSString * _Nonnull, void (^ _Nonnull)(void)))setupRightImageItem{
    return ^(NSString *imageName, void(^action)(void)){
        self.rightItemActionBlock = action;
        UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithImage:[[UIImage imageNamed:imageName] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]style:UIBarButtonItemStylePlain target:self action:@selector(rightItemAction:)];
        self.navigationItem.rightBarButtonItem = item;
        return self;
    };
}

- (void)rightItems:(NSArray<HRBarItem *> *)items actions:(void(^)(NSInteger))action{
    self.rightItemsActionBlock = action;
    NSMutableArray *barButtonItems = [NSMutableArray array];
    [items enumerateObjectsUsingBlock:^(HRBarItem * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:obj];
        obj.tag = idx;
        [obj addTarget:self action:@selector(rightItemAction:) forControlEvents:UIControlEventTouchUpInside];
        [barButtonItems addObject:item];
        if (obj.frame.size.width == 0) {
            [obj sizeToFit];
        }
    }];
    self.navigationItem.rightBarButtonItems = barButtonItems;
}

- (RLBaseViewController *(^)(NSArray <HRBarItem *>*items,void (^actions)(NSInteger index)))setupRightItems {
    return ^(NSArray <HRBarItem *>*items,void (^actions)(NSInteger index)){
        self.rightItemsActionBlock = actions;
        NSMutableArray *barButtonItems = [NSMutableArray array];
        [items enumerateObjectsUsingBlock:^(HRBarItem * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:obj];
            obj.tag = idx;
            [obj addTarget:self action:@selector(rightItemAction:) forControlEvents:UIControlEventTouchUpInside];
            [barButtonItems addObject:item];
            if (obj.frame.size.width == 0) {
                [obj sizeToFit];
            }
        }];
        self.navigationItem.rightBarButtonItems = barButtonItems;
        return self;
    };
}

- (RLBaseViewController * _Nonnull (^)(void))setupHiddenBackItem{
    return ^{
        self.navigationItem.hidesBackButton = YES;
        return self;
    };
}

@end

HRBarItem.h:

#import <UIKit/UIKit.h>

@interface HRBarItem : UIButton

/*!
 *  @author Nobility, 16-09-06 11:09:36
 *
 *  @brief frame
 *
 *  @since 1.0.0
 */
- (HRBarItem *(^)(CGRect))setupFrame;
/*!
 *  @author Nobility, 16-09-06 10:09:54
 *
 *  @brief 标题
 *
 *  @since 1.0.0
 */
- (HRBarItem *(^)(NSString *))setupTitle;

/*!
 *  @author Nobility, 16-09-06 10:09:02
 *
 *  @brief 标题颜色
 *
 *  @since 1.0.0
 */
- (HRBarItem *(^)(UIColor *))setupTitleColor;

/*!
 *  @author Nobility, 16-09-06 10:09:10
 *
 *  @brief 字体
 *
 *  @since 1.0.0
 */
- (HRBarItem *(^)(UIFont *))setupFont;

/*!
 *  @author Nobility, 16-09-06 10:09:16
 *
 *  @brief 边距(需要重置frame)
 *
 *  @since 1.0.0
 */
- (HRBarItem *(^)(UIEdgeInsets))setupTitleEdgeInserts;



@end

HRBarItem.m:

#import "HRBarItem.h"

@implementation HRBarItem

#pragma mark - ---------- Public Methods ----------

- (HRBarItem *(^)(CGRect))setupFrame {
    return ^(CGRect rect) {
        self.frame = rect;
        return self;
    };
}
- (HRBarItem *(^)(NSString *))setupTitle {
    return ^(NSString *title){
        [self setTitle:title forState:UIControlStateNormal];
        return self;
    };
}
- (HRBarItem *(^)(UIColor *))setupTitleColor {
    return ^(UIColor *color) {
        [self setTitleColor:color forState:UIControlStateNormal];
        return self;
    };
}

- (HRBarItem *(^)(UIFont *))setupFont {
    return ^(UIFont *font) {
        [self.titleLabel setFont:font];
        return self;
    };
}

- (HRBarItem *(^)(UIEdgeInsets))setupTitleEdgeInserts {
    return ^(UIEdgeInsets edge) {
        [self setTitleEdgeInsets:edge];
        [self sizeToFit];
        return self;
    };
}
@end

Appdelegate中的使用:

    BaseTabbarViewController *tabbarVC = [[BaseTabbarViewController alloc]initWithChildControllerNames:@[@"MainViewController",@"FindViewController",@"MineViewController"]];
    tabbarVC.setupItemTitles(@[@"首页",@"发现",@"我的"]).setUpUnSelectImages(@[@"shouye",@"faxian",@"geren"]).setUpSelectImages(@[@"shouye",@"faxian",@"geren"]);
    self.window.rootViewController = tabbarVC;

ViewControler中单航条的设置:

    self.setUpNaviTitle(@"首页").setUpTitleFont([UIFont systemFontOfSize:17]).setUpTitleColcor([UIColor whiteColor]);
    [self rightImageItem:@"shouye" action:^{
        
    }];
发布了138 篇原创文章 · 获赞 21 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/grl18840839630/article/details/85789563
今日推荐