参照常用的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的指向控制器,另中心按钮可以在需要时添加,不需要时可以不添加,按自己项目需求来调用对应方法。