参照常用的app中的tabbar进行了大致的封装,效果图如下

废话不说,贴代码
该项目中主要使用了自定义的tabBar以及tabBarController
【1】自定义tabBar
#import <UIKit/UIKit.h>
@protocol CenterTabBarDelegate<NSObject>
- (void)centerTabBarClick;
@end
@interface CenterTabBar : UITabBar
/*添加中间按钮
image-图片
centerColor-中心按钮背景颜色 nil则默认红色
clickHandler-按钮点击事件
*/
- (void)addCenterBtnWithImage:(NSString *)image
centerColor:(UIColor *)centerColor;
@property (weak, nonatomic) id <CenterTabBarDelegate> centerDelegate;
@end
#import "CenterTabBar.h"
@interface CenterTabBar ()
@property (nonatomic, weak) UIButton *centerBtn;
@property (nonatomic, assign) BOOL createCenter;
@end
@implementation CenterTabBar
- (void)addCenterBtnWithImage:(NSString *)image
centerColor:(UIColor *)centerColor {
self.createCenter = YES;
UIButton *centerBtn = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 50, 50)];
centerBtn.adjustsImageWhenHighlighted = NO;
centerBtn.clipsToBounds = YES;
self.centerBtn = centerBtn;
[self addSubview:centerBtn];
self.centerBtn.backgroundColor = centerColor ? centerColor : [UIColor redColor];
[self.centerBtn setImage:[UIImage imageNamed:image] forState:UIControlStateNormal];
[self.centerBtn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside];
}
- (void)btnClick {
if (self.centerDelegate && [self.centerDelegate respondsToSelector:@selector(centerTabBarClick)]) {
[self.centerDelegate centerTabBarClick];
}
}
- (void)layoutSubviews {
[super layoutSubviews];
if (self.createCenter) {
NSInteger totalNum = self.items.count + 1;
CGFloat totalWidth = self.bounds.size.width;
CGFloat totalHeight = self.bounds.size.height;
//设置中间按钮的中心点
CGPoint tempPoint = self.centerBtn.center;
tempPoint.x = totalWidth * 0.5;//水平居中
tempPoint.y = totalHeight * 0.3;//垂直方向中心点设置
self.centerBtn.center = tempPoint;
CGFloat tabBarButtonW = totalWidth / totalNum;
//设置中间按钮的大小及圆角
self.centerBtn.layer.cornerRadius = MIN(tabBarButtonW, totalHeight)/2;
CGRect centerRect = self.centerBtn.frame;
centerRect.size.width = MIN(tabBarButtonW, totalHeight);
centerRect.size.height = MIN(tabBarButtonW, totalHeight);
self.centerBtn.frame = centerRect;
//设置其他按钮的位置
CGFloat tabBarButtonIndex = 0;
for (UIView *child in self.subviews) {
Class class = NSClassFromString(@"UITabBarButton");
if ([child isKindOfClass:class]) {
CGRect tempRect = child.frame;
tempRect.origin.x = tabBarButtonIndex * tabBarButtonW;
tempRect.size.width = tabBarButtonW;
child.frame = tempRect;
// 增加索引
tabBarButtonIndex++;
if (tabBarButtonIndex == (self.items.count / 2)) {
tabBarButtonIndex++;
}
}
}
}
}
@end
【2】自定义tabBarController
#import <UIKit/UIKit.h>
@protocol BaseTabBarControllerDelegate <NSObject>
- (void)centerBtnClick;
@end
@interface BaseTabBarController : UITabBarController
/*初始化
normalColor-TabBar默认颜色 nil则默认黑色
selectedColor-TabBar选中颜色 nil则默认红色
*/
+ (instancetype)instanceWithNormalColor:(UIColor *)normalColor
selectedColor:(UIColor *)selectedColor;
/*TabBar默认颜色*/
@property (nonatomic, strong)UIColor *normalColor;
/*TabBar选中颜色*/
@property (nonatomic, strong)UIColor *selectedColor;
@property (weak, nonatomic) id <BaseTabBarControllerDelegate> centerDelegate;
/*添加子控制器对应TabBar
childVC-子控制器
title-子控制器标题,需注意当控制器设置了title时会使用控制器self.title而不是这时候传入的title
image-图片
selectedImage-选中图片
*/
- (void)addChildVc:(UIViewController *)childVC title:(NSString *)title image:(NSString *)image selectedImage:(NSString *)selectedImage;
/*添加中间按钮
image-图片
centerColor-中心按钮背景颜色 nil则默认红色
clickHandler-按钮点击事件
*/
- (void)addCenterBtnWithImage:(NSString *)image
centerColor:(UIColor *)centerColor;
@end
#import "BaseTabBarController.h"
#import "FourViewController.h"
#import "CenterTabBar.h"
@interface BaseTabBarController ()<CenterTabBarDelegate>
@property (weak, nonatomic) CenterTabBar *centerTabBar;
@end
@implementation BaseTabBarController
#pragma mark - lifeCycle
+ (instancetype)instanceWithNormalColor:(UIColor *)normalColor
selectedColor:(UIColor *)selectedColor {
BaseTabBarController *tabBarController = [[BaseTabBarController alloc]init];
tabBarController.normalColor = normalColor ? normalColor : [UIColor blackColor];
tabBarController.selectedColor = selectedColor ? selectedColor : [UIColor redColor];
return tabBarController;
}
- (void)viewDidLoad {
[super viewDidLoad];
CenterTabBar *tabBar = [[CenterTabBar alloc] init];
tabBar.centerDelegate = self;
// KVC:如果要修系统的某些属性,但被设为readOnly,就是用KVC,即setValue:forKey:
[self setValue:tabBar forKey:@"tabBar"];
self.centerTabBar = tabBar;
}
- (void)addChildVc:(UIViewController *)childVc title:(NSString *)title image:(NSString *)image selectedImage:(NSString *)selectedImage
{
// 设置子控制器的文字
childVc.title = title;
// 设置子控制器的图片
childVc.tabBarItem.image = [UIImage imageNamed:image];
childVc.tabBarItem.selectedImage = [[UIImage imageNamed:selectedImage]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
// 设置文字的样式
NSMutableDictionary *textAttrs = [NSMutableDictionary dictionary];
textAttrs[NSForegroundColorAttributeName] = self.normalColor;
NSMutableDictionary *selectTextAttrs = [NSMutableDictionary dictionary];
selectTextAttrs[NSForegroundColorAttributeName] = self.selectedColor;
[childVc.tabBarItem setTitleTextAttributes:textAttrs forState:UIControlStateNormal];
[childVc.tabBarItem setTitleTextAttributes:selectTextAttrs forState:UIControlStateSelected];
// 先给外面传进来的小控制器 包装 一个导航控制器
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:childVc];
// 添加为子控制器
[self addChildViewController:nav];
}
//添加中心按钮
- (void)addCenterBtnWithImage:(NSString *)image
centerColor:(UIColor *)centerColor {
[self.centerTabBar addCenterBtnWithImage:image centerColor:centerColor];
}
#pragma mark - CenterTabBarDelegate
- (void)centerTabBarClick {
if (self.centerDelegate && [self.centerDelegate respondsToSelector:@selector(centerBtnClick)]) {
[self.centerDelegate centerBtnClick];
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
@end
【3】实际使用(appdelegate)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
UIStoryboard *board = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
OneViewController *oneVC = [board instantiateViewControllerWithIdentifier:@"OneViewController"];
TwoViewController *twoVC = [board instantiateViewControllerWithIdentifier:@"TwoViewController"];
ThreeViewController *threeVC = [board instantiateViewControllerWithIdentifier:@"ThreeViewController"];
FourViewController *fourVC = [[FourViewController alloc]init];
BaseTabBarController *tabBarController = [BaseTabBarController instanceWithNormalColor:nil selectedColor:[UIColor orangeColor]];
tabBarController.centerDelegate = self;
self.tabBarController = tabBarController;
//添加tabbar的指向控制器
[tabBarController addChildVc:oneVC title:@"one" image:@"SOSMenuBusinessCard" selectedImage:@"SOSMenuBusinessCard_Highlighted"];
[tabBarController addChildVc:twoVC title:@"two" image:@"SOSMenuMoreFuncrions" selectedImage:@"SOSMenuMoreFuncrions_Highlighted"];
[tabBarController addChildVc:threeVC title:@"three" image:@"SOSMenuSetting" selectedImage:@
"SOSMenuSetting_Highlighted"];
[tabBarController addChildVc:fourVC title:@"four" image:@"SOSMenuCommonlyUsedFunctions" selectedImage:@"SOSMenuCommonlyUsedFunctions_Highlighted"];
//添加中心按钮
[tabBarController addCenterBtnWithImage:@"SOSMenuLogout" centerColor:[UIColor orangeColor]];
self.window.rootViewController = tabBarController;
[self.window makeKeyAndVisible];
return YES;
}
- (void)centerBtnClick {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"点击了中心tabbar" message:nil preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];
[alert addAction:cancel];
[self.tabBarController presentViewController:alert animated:YES completion:nil];
}
其中,你可选择添加哪些控制器作为tabbar的指向控制器,另中心按钮可以在需要时添加,不需要时可以不添加,按自己项目需求来调用对应方法。
浙公网安备 33010602011771号