| 需要实现的效果(参考 百思不得姐)
中间的UITabBarButton 没有对应的UIViewContrller. 所以需要重新布局.
自定义了一个RootViewController(YYRootTabBarController 其继承自UITabBarController )
#import "AppDelegate.h"
#import "YYRootTabBarController.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
self.window.rootViewController = [[YYRootTabBarController alloc]init];
[self.window makeKeyAndVisible];
return YES;
}
...
YYRootTabBarController.h 文件
#import <UIKit/UIKit.h>
@interface YYRootTabBarController : UITabBarController
@end
YYRootTabBarController.m 文件
#import "YYRootTabBarController.h"
#import "YYFirstViewController.h"
#import "YYSecondViewController.h"
#import "YYThirdViewController.h"
#import "YYFourViewController.h"
#import "YYTabBar.h"
@interface YYRootTabBarController ()
@end
@implementation YYRootTabBarController
- (void)viewDidLoad {
[super viewDidLoad];
// 设置应用程序中所有的UITabBarItem 的属性
UITabBarItem *item = [UITabBarItem appearance]; // 认为是一个皮肤
// 属性字典
NSDictionary *normalDic = @{NSFontAttributeName:[UIFont systemFontOfSize:12],
NSForegroundColorAttributeName:[UIColor grayColor]
};
NSDictionary *selectedDic = @{NSForegroundColorAttributeName:[UIColor darkGrayColor]
};
[item setTitleTextAttributes:normalDic forState:UIControlStateNormal];
[item setTitleTextAttributes:selectedDic forState:UIControlStateSelected];
YYTabBar *tabBar = [[YYTabBar alloc]init];
[self setValue:tabBar forKey:@"tabBar"];
//初始化我们的自控制器
[self setUpChildVC];
}
- (void)setUpChildVC{
// 第一个
[self setUpChildViewController:[[YYFirstViewController alloc] init] title:@"首页" normalImageName:@"" selectedImageName:@""];
// 第二个
[self setUpChildViewController:[[YYSecondViewController alloc] init] title:@"发现" normalImageName:@"" selectedImageName:@""];
// 第三个
[self setUpChildViewController:[[YYThirdViewController alloc] init] title:@"搜索" normalImageName:@"" selectedImageName:@""];
// 第四个
[self setUpChildViewController:[[YYFourViewController alloc] init] title:@"我的" normalImageName:@"" selectedImageName:@""];
}
// 添加自控制器 如果需要 UINavigationController 可以在这里添加
- (void)setUpChildViewController:(UIViewController *)vc title:(NSString *)title normalImageName:(NSString *)normalImageName selectedImageName:(NSString *)selectedImageName{
UINavigationController *NAV = [[UINavigationController alloc]initWithRootViewController:vc
];
vc.tabBarItem.title = title;
vc.tabBarItem.image = [UIImage imageNamed:normalImageName]; // 防止图片使用系统默认颜色 [[UIImage imageNamed:@""] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
vc.tabBarItem.selectedImage = [UIImage imageNamed:selectedImageName]; // 防止图片使用系统默认颜色 [[UIImage imageNamed:@""] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
[self addChildViewController:NAV];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
@end
YYTabBar.h 文件
#import <UIKit/UIKit.h>
@interface YYTabBar : UITabBar
@end
YYTabBar.m 文件
#import "YYTabBar.h"
@interface YYTabBar()
@property (nonatomic, weak) UIButton *plushBtn; // 中间红的的加号
@end
@implementation YYTabBar
- (instancetype)initWithFrame:(CGRect)frame{
if (self = [super initWithFrame:frame]) {
// 设置背景图片
self.backgroundImage = [UIImage imageNamed:@""];
// 初始化操作
UIButton *plushBtn = [[UIButton alloc]init];
[plushBtn setBackgroundImage:[UIImage imageNamed:@""] forState:UIControlStateNormal];
[plushBtn setBackgroundImage:[UIImage imageNamed:@""] forState:UIControlStateHighlighted];
self.plushBtn = plushBtn;
[self addSubview:plushBtn];
}
return self;
}
//布局子空间
- (void)layoutSubviews{
[super layoutSubviews];
self.plushBtn.bounds = CGRectMake(0, 0, self.plushBtn.currentBackgroundImage.size.width, self.plushBtn.currentBackgroundImage.size.height); // 以背景图片的大小设置按钮的大小
self.plushBtn.center = CGPointMake(self.frame.size.width * 0.5, self.frame.size.height * 0.5); // 应该等价于 self.plushBtn.center = self.center;
// 布局UItabBarButton
int index = 0;
CGFloat W = self.frame.size.width * 0.2; // 一共 5 个 评分, 所有每个占 0.2
CGFloat H = self.frame.size.height;
CGFloat Y = 0;
for (UIView * view in self.subviews) {
Class class = NSClassFromString(@"UITabBarButton");
if ([view isKindOfClass:class]) {
CGFloat X = W * ((index == 2) ? ++index : index); // 跳过当中的那一个
view.frame = CGRectMake(X, Y, W, H);
index ++;
}
}
}
@end
补充: 1.其中图片的名称没有补全
2.如果有什么问题, 可以私信