简介
UITabBar是iOS App中经常使用的系统控件,比如知名App:新浪微博,微信,腾讯QQ等。在实际的项目开发中,系统的UITabBar有时满足不了我们的需求,这是就需要自定义tabBar了。
MainViewController
.h文件
#import
@interfaceMainViewController:UITabBarController
@end
.m文件
#import"MainViewController.h"
#import"HomeViewController.h"// 首页
#import"MessageViewController.h"// 消息
#import"DiscoverViewController.h"// 发现
#import"ProfileViewController.h"// 我
#import"ZTNavigationController.h"// 自定义导航控制器
#import"ZTTabBar.h"// 自定义tabBar
@interfaceMainViewController()
@end
@implementationMainViewController
- (void)viewDidLoad {
[superviewDidLoad];
// 添加子控制器
[selfaddChildVc:[[HomeViewController alloc] init] title:@"首页"image:@"tabbar_home"selectedImage:@"tabbar_home_selected"];
[selfaddChildVc:[[MessageViewController alloc] init] title:@"消息"image:@"tabbar_message_center"selectedImage:@"tabbar_message_center_selected"];
[selfaddChildVc:[[DiscoverViewController alloc] init] title:@"发现"image:@"tabbar_discover"selectedImage:@"tabbar_discover_selected"];
[selfaddChildVc:[[ProfileViewController alloc] init] title:@"我"image:@"tabbar_profile"selectedImage:@"tabbar_profile_selected"];
ZTTabBar *tabBar = [[ZTTabBar alloc] init];
// 设置代理
tabBar.delegate=self;
// KVC:如果要修系统的某些属性,但被设为readOnly,就是用KVC,即setValue:forKey:。
// 修改tabBar为自定义tabBar
[selfsetValue:tabBar forKey:@"tabBar"];
}
- (void)addChildVc:(UIViewController*)childVc title:(NSString*)title image:(NSString*)image selectedImage:(NSString*)selectedImage
{
// 设置子控制器的文字(可以设置tabBar和navigationBar的文字)
childVc.title= title;
// 设置子控制器的tabBarItem图片
childVc.tabBarItem.image= [UIImageimageNamed:image];
// 禁用图片渲染
childVc.tabBarItem.selectedImage= [[UIImageimageNamed:selectedImage] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
// 设置文字的样式
[childVc.tabBarItemsetTitleTextAttributes:@{NSForegroundColorAttributeName: RGBColor(123,123,123)} forState:UIControlStateNormal];
[childVc.tabBarItemsetTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColororangeColor]} forState:UIControlStateSelected];
// childVc.view.backgroundColor = RandomColor; // 这句代码会自动加载主页,消息,发现,我四个控制器的view,但是view要在我们用的时候去提前加载
// 为子控制器包装导航控制器
ZTNavigationController *navigationVc = [[ZTNavigationController alloc] initWithRootViewController:childVc];
// 添加子控制器
[selfaddChildViewController:navigationVc];
}
#pragma ZTTabBarDelegate
- (void)tabBarDidClickPlusButton:(ZTTabBar *)tabBar
{
// 点击事件内容
UIViewController*vc = [[UIViewControlleralloc] init];
[selfpresentViewController:vc animated:YES completion:nil];
}
@end
自定义TabBar:ZTTabBar
.h文件
#import
@classZTTabBar;
#warning ZTTabBar继承自UITabBar,所以ZTTabBar的代理必须遵循UITabBar的代理协议!
@protocolZTTabBarDelegate
@optional
- (void)tabBarDidClickPlusButton:(ZTTabBar *)tabBar;
@end
@interfaceZTTabBar:UITabBar
@property(nonatomic,weak)iddelegate;
@end
.m文件
#import"ZTTabBar.h"
@interfaceZTTabBar()
@property(nonatomic,weak)UIButton*plusBtn;
@end
@implementationZTTabBar
- (instancetype)initWithFrame:(CGRect)frame
{
self= [superinitWithFrame:frame];
if(self) {
UIButton*plusBtn = [[UIButtonalloc] init];
[plusBtn setBackgroundImage:[UIImageimageNamed:@"tabbar_compose_button"] forState:UIControlStateNormal];
[plusBtn setBackgroundImage:[UIImageimageNamed:@"tabbar_compose_button_highlighted"] forState:UIControlStateHighlighted];
[plusBtn setImage:[UIImageimageNamed:@"tabbar_compose_icon_add"] forState:UIControlStateNormal];
[plusBtn setImage:[UIImageimageNamed:@"tabbar_compose_icon_add_highlighted"] forState:UIControlStateHighlighted];
plusBtn.size= plusBtn.currentBackgroundImage.size;
[plusBtn addTarget:selfaction:@selector(plusBtnClick) forControlEvents:UIControlEventTouchUpInside];
[selfaddSubview:plusBtn];
self.plusBtn= plusBtn;
}
returnself;
}
- (void)plusBtnClick
{
// 通知代理
if([self.delegaterespondsToSelector:@selector(tabBarDidClickPlusButton:)]) {
[self.delegatetabBarDidClickPlusButton:self];
}
}
- (void)layoutSubviews
{
[superlayoutSubviews];
// 1.设置加号按钮的位置
self.plusBtn.centerX=self.width*0.5;
self.plusBtn.centerY=self.height*0.5;
// 2.设置其他tabbarButton的frame
CGFloattabBarButtonW =self.width/5;
CGFloattabBarButtonIndex =0;
for(UIView*childinself.subviews) {
Class class =NSClassFromString(@"UITabBarButton");
if([child isKindOfClass:class]) {
// 设置x
child.x= tabBarButtonIndex * tabBarButtonW;
// 设置宽度
child.width= tabBarButtonW;
// 增加索引
tabBarButtonIndex++;
if(tabBarButtonIndex ==2) {
tabBarButtonIndex++;
}
}
}
}
@end
ZTNavigationController
.h文件
#import
@interfaceZTNavigationController:UINavigationController
@end
.m文件
#import"ZTNavigationController.h"
@interfaceZTNavigationController()
@end
@implementationZTNavigationController
// 只初始化一次
+ (void)initialize
{
// 设置项目中item的主题样式
UIBarButtonItem*item = [UIBarButtonItemappearance];
// Normal
NSMutableDictionary*textAttrs = [NSMutableDictionarydictionary];
textAttrs[NSForegroundColorAttributeName] = [UIColororangeColor];
textAttrs[NSFontAttributeName] = [UIFontsystemFontOfSize:13];
[item setTitleTextAttributes:textAttrs forState:UIControlStateNormal];
// 不可用状态
NSMutableDictionary*disableTextAttrs = [NSMutableDictionarydictionary];
disableTextAttrs[NSForegroundColorAttributeName] = RGBColor(123,123,123);
disableTextAttrs[NSFontAttributeName] = [UIFontsystemFontOfSize:13];
[item setTitleTextAttributes:disableTextAttrs forState:UIControlStateDisabled];
}
- (void)viewDidLoad {
[superviewDidLoad];
// Do any additional setup after loading the view.
}
- (void)pushViewController:(UIViewController*)viewController animated:(BOOL)animated
{
if(self.viewControllers.count>0) {// 此时push进来的viewController是第二个子控制器
// 自动隐藏tabbar
viewController.hidesBottomBarWhenPushed= YES;
// 定义leftBarButtonItem
viewController.navigationItem.leftBarButtonItem= [UIBarButtonItemitemWithTargat:selfaction:@selector(back) image:@"navigationbar_back"highImage:@"navigationbar_back_highlighted"];
// 定义rightBarButtonItem
viewController.navigationItem.rightBarButtonItem= [UIBarButtonItemitemWithTargat:selfaction:@selector(more) image:@"navigationbar_more"highImage:@"navigationbar_more_highlighted"];
}
// 调用父类pushViewController,self.viewControllers数组添加对象viewController
[superpushViewController:viewController animated:animated];
}
- (void)back
{
// 这里要用self,不能用self.navigationViewController,因为self本身就是导航控制器对象,self.navigationViewController是nil
[selfpopViewControllerAnimated:YES];
}
- (void)more
{
[selfpopToRootViewControllerAnimated:YES];
}
@end
DEMO 下载地址:https://pan.baidu.com/s/1c2EeMlU