iOS 自定义tabBar

简介

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: UIImageRenderingModeAlwaysOriginal ];

// 设置文字的样式
[childVc .tabBarItem setTitleTextAttributes:@{ NSForegroundColorAttributeName : RGBColor( 123 , 123 , 123 )} forState: UIControlStateNormal ];
[childVc .tabBarItem setTitleTextAttributes:@{ NSForegroundColorAttributeName : [ UIColor orangeColor]} forState: UIControlStateSelected ];
// childVc.view.backgroundColor = RandomColor; // 这句代码会自动加载主页,消息,发现,我四个控制器的view,但是view要在我们用的时候去提前加载

// 为子控制器包装导航控制器
ZTNavigationController *navigationVc = [[ZTNavigationController alloc] initWithRootViewController: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: UIControlStateHighlighted ];
[plusBtn setImage:[ UIImage imageNamed: @"tabbar_compose_icon_add" ] forState: UIControlStateNormal ];
[plusBtn setImage:[ UIImage imageNamed: @"tabbar_compose_icon_add_highlighted" ] forState: UIControlStateHighlighted ];

plusBtn .size = plusBtn .currentBackgroundImage .size ;
[plusBtn addTarget: self action: @selector (plusBtnClick) forControlEvents: UIControlEventTouchUpInside ];
[ 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[ NSForegroundColorAttributeName ] = [ UIColor orangeColor];
textAttrs[ NSFontAttributeName ] = [ UIFont systemFontOfSize: 13 ];
[item setTitleTextAttributes:textAttrs forState: UIControlStateNormal ];

// 不可用状态
NSMutableDictionary *disableTextAttrs = [ NSMutableDictionary dictionary];
disableTextAttrs[ NSForegroundColorAttributeName ] = 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 popViewControllerAnimated:YES];
}

- ( void )more
{
[ self popToRootViewControllerAnimated:YES];
}

@end

DEMO 下载地址: https://pan.baidu.com/s/1c2EeMlU
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值