簡介
UITabBar是iOS App中經常使用的系統控件,比如知名App:新浪微博,微信,騰訊QQ等。在實際的項目開發中,系統的UITabBar有時滿足不了我們的需求,這是就需要自定義tabBar了。
MainViewController
.h文件
#import
@interfaceMainViewController:UITabBarController
@end
.m文件
#import"MainViewController.h"
#import"HomeViewController.h"http:// 首頁
#import"MessageViewController.h"http:// 消息
#import"DiscoverViewController.h"http:// 發現
#import"ProfileViewController.h"http:// 我
#import"ZTNavigationController.h"http:// 自定義導航控制器
#import"ZTTabBar.h"http:// 自定義tabBar
@interfaceMainViewController() <ZTTabBarDelegate>
@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<UITabBarDelegate>
@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