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:^{
}];