1>写这篇文章的意义在于,之前我一直用继承UIview的方式自定义UITabBar,这又很多弊端,比如图片的拉伸都需要自己设置。今天用的是继承UITabBar的方式,这样图片以及文字就可以自己管控
首先是在TabBarController里设置子控制器的属性,并加载自定义的UITabBar
- (void)viewDidLoad {
[super viewDidLoad];
/**** 设置所有UITabBarItem的文字属性 ****/
[self setupItemTitleTextAttributes];
/**** 添加子控制器 ****/
[self setupChildViewControllers];
/**** 更换TabBar ****/
[self setupTabBar];
}
/**
* 设置所有UITabBarItem的文字属性
*/
- (void)setupItemTitleTextAttributes
{
UITabBarItem *item = [UITabBarItem appearance];
// 普通状态下的文字属性
NSMutableDictionary *normalAttrs = [NSMutableDictionary dictionary];
normalAttrs[NSFontAttributeName] = [UIFont systemFontOfSize:14];
normalAttrs[NSForegroundColorAttributeName] = [UIColor grayColor];
[item setTitleTextAttributes:normalAttrs forState:UIControlStateNormal];
// 选中状态下的文字属性
NSMutableDictionary *selectedAttrs = [NSMutableDictionary dictionary];
selectedAttrs[NSForegroundColorAttributeName] = [UIColor darkGrayColor];
[item setTitleTextAttributes:normalAttrs forState:UIControlStateSelected];
}
/**
* 添加子控制器
*/
- (void)setupChildViewControllers
{
[self setupOneChildViewController:[[XMGNavigationController alloc] initWithRootViewController:[[XMGEssenceViewController alloc] init]] title:@"精华" image:@"tabBar_essence_icon" selectedImage:@"tabBar_essence_click_icon"];
[self setupOneChildViewController:[[XMGNavigationController alloc] initWithRootViewController:[[XMGNewViewController alloc] init]] title:@"新帖" image:@"tabBar_new_icon" selectedImage:@"tabBar_new_click_icon"];
[self setupOneChildViewController:[[XMGNavigationController alloc] initWithRootViewController:[[XMGFollowViewController alloc] init]] title:@"关注" image:@"tabBar_friendTrends_icon" selectedImage:@"tabBar_friendTrends_click_icon"];
[self setupOneChildViewController:[[XMGNavigationController alloc] initWithRootViewController:[[XMGMeViewController alloc] init]] title:@"我" image:@"tabBar_me_icon" selectedImage:@"tabBar_me_click_icon"];
}
/**
* 初始化一个子控制器
*
* @param vc 子控制器
* @param title 标题
* @param image 图标
* @param selectedImage 选中的图标
*/
- (void)setupOneChildViewController:(UIViewController *)vc title:(NSString *)title image:(NSString *)image selectedImage:(NSString *)selectedImage
{
vc.tabBarItem.title = title;
if (image.length) { // 图片名有具体值
vc.tabBarItem.image = [UIImage imageNamed:image];
vc.tabBarItem.selectedImage = [UIImage imageNamed:selectedImage];
}
[self addChildViewController:vc];
}
/**
* 更换TabBar
*/
- (void)setupTabBar
{
[self setValue:[[XMGTabBar alloc] init] forKeyPath:@"tabBar"];
}
#pragma mark - 懒加载
/** 发布按钮 */
- (UIButton *)publishButton
{
if (!_publishButton) {
UIButton *publishButton = [UIButton buttonWithType:UIButtonTypeCustom];
[publishButton setImage:[UIImage imageNamed:@"tabBar_publish_icon"] forState:UIControlStateNormal];
[publishButton setImage:[UIImage imageNamed:@"tabBar_publish_click_icon"] forState:UIControlStateHighlighted];
[publishButton addTarget:self action:@selector(publishClick) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:publishButton];
_publishButton = publishButton;
}
return _publishButton;
}
#pragma mark - 初始化
- (instancetype)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame]) {
self.backgroundImage = [UIImage imageNamed:@"tabbar-light"];
}
return self;
}
/**
* 布局子控件
*/
- (void)layoutSubviews
{
[super layoutSubviews];
/**** 按钮的尺寸 ****/
CGFloat buttonW = self.xmg_width / 5;
CGFloat buttonH = self.xmg_height;
/**** 设置所有UITabBarButton的frame ****/
CGFloat tabBarButtonY = 0;
// 按钮索引
int tabBarButtonIndex = 0;
for (UIView *subview in self.subviews) {
// 过滤掉非UITabBarButton
if (subview.class != NSClassFromString(@"UITabBarButton")) continue;
// 设置frame
CGFloat tabBarButtonX = tabBarButtonIndex * buttonW;
if (tabBarButtonIndex >= 2) { // 右边的2个UITabBarButton
tabBarButtonX += buttonW;
}
subview.frame = CGRectMake(tabBarButtonX, tabBarButtonY, buttonW, buttonH);
// 增加索引
tabBarButtonIndex++;
}
/**** 设置中间的发布按钮的frame ****/
self.publishButton.xmg_width = buttonW;
self.publishButton.xmg_height = buttonH;
self.publishButton.xmg_centerX = self.xmg_width * 0.5;
self.publishButton.xmg_centerY = self.xmg_height * 0.5;
}
#pragma mark - 监听
- (void)publishClick
{
XMGLogFunc
}
非常简单尤其是涉及到这种tabBar的时候最有效