iOS 自定义tabBar

简介

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

你可能感兴趣的:(iOS 自定义tabBar)