简介
UITabBar是iOS App中经常使用的系统控件,比如知名App:新浪微博,微信,腾讯QQ等。在实际的项目开发中,系统的UITabBar有时满足不了我们的需求,这是就需要自定义tabBar了。
MainViewController
.h文件
#import
@interface
MainViewController
:
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
@interface
MainViewController
() <</span>ZTTabBarDelegate>
@end
@implementation
MainViewController
- (
void
)viewDidLoad {
[
super
viewDidLoad];
// 添加子控制器
[
self
addChildVc:[[HomeViewController alloc] init] title:
@"首页"
image:
@"tabbar_home"
selectedImage:
@"tabbar_home_selected"
];
[
self
addChildVc:[[MessageViewController alloc] init] title:
@"消息"
image:
@"tabbar_message_center"
selectedImage:
@"tabbar_message_center_selected"
];
[
self
addChildVc:[[DiscoverViewController alloc] init] title:
@"发现"
image:
@"tabbar_discover"
selectedImage:
@"tabbar_discover_selected"
];
[
self
addChildVc:[[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
[
self
setValue: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
= [
UIImage
imageNamed:image];
// 禁用图片渲染
childVc
.tabBarItem
.selectedImage
= [[
UIImage
imageNamed:selectedImage] imageWithRenderingMode:
UIImageRenderingModeAlwa ysOriginal
];
// 设置文字的样式
[childVc
.tabBarItem
setTitleTextAttributes:@{
NSForegroundColorAttribu teName
: RGBColor(
123
,
123
,
123
)} forState:
UIControlStateNormal
];
[childVc
.tabBarItem
setTitleTextAttributes:@{
NSForegroundColorAttribu teName
: [
UIColor
orangeColor]} forState:
UIControlStateSelected
];
// childVc.view.backgroundColor = RandomColor; // 这句代码会自动加载主页,消息,发现,我四个控制器的view,但是view要在我们用的时候去提前加载
// 为子控制器包装导航控制器
ZTNavigationController *navigationVc = [[ZTNavigationController alloc] initWithRootViewControll er:childVc];
// 添加子控制器
[
self
addChildViewController:navigationVc];
}
#pragma ZTTabBarDelegate
- (
void
)tabBarDidClickPlusButton :(ZTTabBar *)tabBar
{
// 点击事件内容
UIViewController
*vc = [[
UIViewController
alloc] init];
[
self
presentViewController:vc animated:YES completion:nil];
}
@end
自定义TabBar:ZTTabBar
.h文件
#import
@class
ZTTabBar
;
#warning ZTTabBar继承自UITabBar,所以ZTTabBar的代理必须遵循UITabBar的代理协议!
@protocol
ZTTabBarDelegate
<</span>UITabBarDelegate>
@optional
- (
void
)tabBarDidClickPlusButton :(ZTTabBar *)tabBar;
@end
@interface
ZTTabBar
:
UITabBar
@property
(
nonatomic
,
weak
)
id
delegate;
@end
.m文件
#import
"ZTTabBar.h"
@interface
ZTTabBar
()
@property
(
nonatomic
,
weak
)
UIButton
*plusBtn;
@end
@implementation
ZTTabBar
- (instancetype)initWithFrame:(
CGRect
)frame
{
self
= [
super
initWithFrame:frame];
if
(
self
) {
UIButton
*plusBtn = [[
UIButton
alloc] init];
[plusBtn setBackgroundImage:[
UIImage
imageNamed:
@"tabbar_compose_button"
] forState:
UIControlStateNormal
];
[plusBtn setBackgroundImage:[
UIImage
imageNamed:
@"tabbar_compose_button_highlighted"
] forState:
UIControlStateHighlighte d
];
[plusBtn setImage:[
UIImage
imageNamed:
@"tabbar_compose_icon_add"
] forState:
UIControlStateNormal
];
[plusBtn setImage:[
UIImage
imageNamed:
@"tabbar_compose_icon_add_highlighted"
] forState:
UIControlStateHighlighte d
];
plusBtn
.size
= plusBtn
.currentBackgroundImage
.size
;
[plusBtn addTarget:
self
action:
@selector
(plusBtnClick) forControlEvents:
UIControlEventTouchUpIns ide
];
[
self
addSubview:plusBtn];
self
.plusBtn
= plusBtn;
}
return
self
;
}
- (
void
)plusBtnClick
{
// 通知代理
if
([
self
.delegate
respondsToSelector:
@selector
(tabBarDidClickPlusButton :)]) {
[
self
.delegate
tabBarDidClickPlusButton :
self
];
}
}
- (
void
)layoutSubviews
{
[
super
layoutSubviews];
// 1.设置加号按钮的位置
self
.plusBtn
.centerX
=
self
.width
*
0.5
;
self
.plusBtn
.centerY
=
self
.height
*
0.5
;
// 2.设置其他tabbarButton的frame
CGFloat
tabBarButtonW =
self
.width
/
5
;
CGFloat
tabBarButtonIndex =
0
;
for
(
UIView
*child
in
self
.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
@interface
ZTNavigationController
:
UINavigationController
@end
.m文件
#import
"ZTNavigationController.h"
@interface
ZTNavigationController
()
@end
@implementation
ZTNavigationController
// 只初始化一次
+ (
void
)initialize
{
// 设置项目中item的主题样式
UIBarButtonItem
*item = [
UIBarButtonItem
appearance];
// Normal
NSMutableDictionary
*textAttrs = [
NSMutableDictionary
dictionary];
textAttrs[
NSForegroundColorAttribu teName
] = [
UIColor
orangeColor];
textAttrs[
NSFontAttributeName
] = [
UIFont
systemFontOfSize:
13
];
[item setTitleTextAttributes:textAttrs forState:
UIControlStateNormal
];
// 不可用状态
NSMutableDictionary
*disableTextAttrs = [
NSMutableDictionary
dictionary];
disableTextAttrs[
NSForegroundColorAttribu teName
] = RGBColor(
123
,
123
,
123
);
disableTextAttrs[
NSFontAttributeName
] = [
UIFont
systemFontOfSize:
13
];
[item setTitleTextAttributes:disableTextAttrs forState:
UIControlStateDisabled
];
}
- (
void
)viewDidLoad {
[
super
viewDidLoad];
// 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
= [
UIBarButtonItem
itemWithTargat:
self
action:
@selector
(back) image:
@"navigationbar_back"
highImage:
@"navigationbar_back_highlighted"
];
// 定义rightBarButtonItem
viewController
.navigationItem
.rightBarButtonItem
= [
UIBarButtonItem
itemWithTargat:
self
action:
@selector
(more) image:
@"navigationbar_more"
highImage:
@"navigationbar_more_highlighted"
];
}
// 调用父类pushViewController,self.viewControllers数组添加对象viewController
[
super
pushViewController:viewController animated:animated];
}
- (
void
)back
{
// 这里要用self,不能用self.navigationViewController ,因为self本身就是导航控制器对象,self.navigationViewController 是nil
[
self
popViewControllerAnimate d:YES];
}
- (
void
)more
{
[
self
popToRootViewControllerA nimated:YES];
}
@end
DEMO 下载地址:
https://pan.baidu.com/s/1c2EeMlU