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() <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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容