一,基本配置
1.首先的需要搭配一些骨架,本项目采用的根控制器时以TabBarController为根控制器。
第一个修改点:
image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
这句是使图片保持以前的样子,而不被系统修改为蓝色
上述是代码,也可以通过Assets.xcassets也就是专门管理图片的,点击修改图片的一个属性即可,改为Rende As 改为Original Image就可以
第二个修改点:
UIViewController *vc = [[UIViewController alloc]init];
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
dict[NSFontAttributeName] = [UIFont systemFontOfSize:13];
dict[NSForegroundColorAttributeName] = [UIColor whiteColor];
[vc.tabBarItem setTitleTextAttributes:dict forState:UIControlStateNormal];
// 上述就是单独修改控制器下TabBarItem中文字颜色当被点击时,不被系统改动,当然也有一个更好的方法.
// 通过UitabBarItem中Appearance的属性来修改多个Item中文字的属性更改
NSMutableDictionary *attrs = [NSMutableDictionary dictionary]; attrs[NSFontAttributeName] = [UIFont systemFontOfSize:12]; attrs[NSForegroundColorAttributeName] = [UIColor grayColor]; NSMutableDictionary *selectedAttrs = [NSMutableDictionary dictionary]; selectedAttrs[NSFontAttributeName] = attrs[NSFontAttributeName]; selectedAttrs[NSForegroundColorAttributeName] = [UIColor darkGrayColor]; UITabBarItem *item = [UITabBarItem appearance]; [item setTitleTextAttributes:attrs forState:UIControlStateNormal]; [item setTitleTextAttributes:selectedAttrs forState:UIControlStateSelected];
这样也就可以通过多个子控制器中,只需要设置一次就可以满足所有其当中属性更改,当然也需要方法后面有
UI_APPEARANCE_SELECTOR;才能利用Appearance统一设置
2.自定义子控器
// 建立一个初始化子控制器的方法 - (void)setUpChildVc:(UIViewController *)vc title:(NSString *)title image:(NSString *)Image selectedImage:(NSString *)selectedImage{ vc.tabBarItem.title = title; vc.tabBarItem.image = [UIImage imageNamed:Image]; vc.tabBarItem.selectedImage = [UIImage imageNamed:selectedImage]; // 包装一个导航控制器, 添加导航控制器为tabbarcontroller的子控制器 ZWNavigationController *naVc = [[ZWNavigationController alloc]initWithRootViewController:vc]; [self addChildViewController:naVc]; }
这样就方便简化ViewDidload中的代码量,也同时减少了代码冗余。
项目截图:如果要的得到类似的TabBar控制器的话,就必须得自定义
2.2 自定义TabBar
// 更换tabBar // self.tabBar = [[XMGTabBar alloc] init]; tabar属性为只读属性,所以可以通过kvc的方式来替换系统的tabbar [self setValue:[[ZWTabBar alloc] init] forKeyPath:@"tabBar"];
通过KVC的方式来修改_TabBar来达到修改TabBar的属性
然后通过layoutSubviews的方法来改变所需TabBar的样式
- (void)layoutSubviews { [super layoutSubviews]; CGFloat width = self.width; CGFloat height = self.height; // 设置发布按钮的frame self.publishButton.bounds = CGRectMake(0, 0, self.publishButton.currentBackgroundImage.size.width , self.publishButton.currentBackgroundImage.size.height); self.publishButton.center = CGPointMake(width * 0.5, height * 0.5); // 设置其他UITabBarButton的frame CGFloat buttonY = 0; CGFloat buttonW = width / 5; CGFloat buttonH = height; NSInteger index = 0; for (UIView *button in self.subviews) { if (![button isKindOfClass:[UIControl class]] || button == self.publishButton) continue; // 计算按钮的x值 CGFloat buttonX = buttonW * ((index > 1)?(index + 1):index); button.frame = CGRectMake(buttonX, buttonY, buttonW, buttonH); // 增加索引 index++; } }
通过上述代码就能得到上述图片的样式.