iOS開發中經常會遇到自定義tabbar,有時候會要求中間的Item往上突起,這裏做了個簡單的封裝,只要在tabbarController中實現即可,先看看效果圖:
以下是實現代碼,只要把代碼拷貝進去,裏面的試圖控制器替換成自己的即可,自己也可以做相應的修改:
視圖控制器繼承自tabarControllder
.h文件:
//
// MainViewController.h
// tabbarDemo
//
// Created by HandsomeC on 17/6/19.
// Copyright © 2017年 趙發生. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface MainViewController : UITabBarController
@end
.m文件:
//
// MainViewController.m
// tabbarDemo
//
// Created by HandsomeC on 17/6/19.
// Copyright © 2017年 趙發生. All rights reserved.
//
#import "MainViewController.h"
#import "HomeViewController.h"
#import "MessageViewController.h"
#import "SendViewController.h"
#import "KindViewController.h"
#import "MineViewController.h"
#define RGBCOL(r,g,b,a) [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:1.0]
@interface MainViewController ()<UITabBarControllerDelegate>
@property (nonatomic,strong)UIButton *button;
@property (nonatomic, strong) HomeViewController *homeVC;
@property (nonatomic, strong) KindViewController *kindVC;
@property (nonatomic, strong) MessageViewController *msgVC;
@property (nonatomic, strong) MineViewController *mineVC;
@end
@implementation MainViewController
@synthesize button;
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor colorWithRed:238/255.0f green:238/255.0f blue:238/255.0f alpha:1.0];
[self setTabBarVC];
// 添加中間突出按鈕
[self addCenterButtonWithImage:[UIImage imageNamed:@"send"] selectedImage:[UIImage imageNamed:@"send"]];
//設置代理方法
self.delegate = self;
[self.tabBar setBackgroundImage:[UIImage imageNamed:@"line"]];
}
/**
重寫突出按鈕的點擊事件,使其與tabbarItem中間那個按鈕的點擊事件一致,點擊的時候,其他按鈕選中爲否,當前tababtrController選中視圖爲中間按鈕的值,self.selectedIndex隨着中間按鈕的位置而變動
@param sender 點擊的按鈕
*/
-(void)pressChange:(id)sender
{
self.selectedIndex=2;
button.selected=NO;
}
/**
初始化所有子視圖控制器
這裏的自視圖控制器可以自己任意刪除和添加,在中間需要突出的按鈕那裏不要設置圖片,只需要設置視圖標題,即爲tabbarItem的下方文字
*/
- (void)setTabBarVC{
[self setTabBarChildController:[[HomeViewController alloc] init] title:@"庫購" image:@"home" selectImage:@"home1"];
[self setTabBarChildController:[[KindViewController alloc] init] title:@"分類" image:@"kind" selectImage:@"kind1"];
[self setTabBarChildController:[[SendViewController alloc] init] title:@"發佈" image:@"" selectImage:@""];
[self setTabBarChildController:[[MessageViewController alloc] init] title:@"消息" image:@"massage" selectImage:@"massage1"];
[self setTabBarChildController:[[MineViewController alloc] init] title:@"我的" image:@"mine" selectImage:@"mine1"];
}
/**
添加中間按鈕,這裏可以有選中按鈕
@param buttonImage 中間突出按鈕的正常圖片
@param selectedImage 中間突出按鈕的選中圖片,如果沒有,則爲空
*/
-(void) addCenterButtonWithImage:(UIImage*)buttonImage selectedImage:(UIImage*)selectedImage
{
button = [UIButton buttonWithType:UIButtonTypeCustom];
//重寫中間按鈕的點擊事件
[button addTarget:self action:@selector(pressChange:) forControlEvents:UIControlEventTouchUpInside];
button.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleTopMargin;
// 設定button大小爲適應圖片
button.frame = CGRectMake(0.0, 0.0, buttonImage.size.width, buttonImage.size.height);
[button setImage:buttonImage forState:UIControlStateNormal];
[button setImage:selectedImage forState:UIControlStateSelected];
// 去掉選中button時候的陰影
button.adjustsImageWhenHighlighted=NO;
/*
* 核心代碼:設置button的center 和 tabBar的 center 做對齊操作, 同時做出相對的上浮
*/
CGPoint center = self.tabBar.center;
//這裏是上浮操作,把中間按鈕往上移動相應像素
center.y = center.y - buttonImage.size.height/4-10;
button.center = center;
[self.view addSubview:button];
}
// 添加tabbar的子viewcontroller
- (void)setTabBarChildController:(UIViewController*)controller title:(NSString*)title image:(NSString*)imageStr selectImage:(NSString*)selectImageStr{
UINavigationController* nav = [[UINavigationController alloc] initWithRootViewController:controller];
nav.tabBarItem.title = title;
nav.tabBarItem.image = [[UIImage imageNamed:imageStr]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
nav.tabBarItem.selectedImage = [[UIImage imageNamed:selectImageStr]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
//設置正常的文字顏色
[nav.tabBarItem setTitleTextAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:12],NSForegroundColorAttributeName:RGBCOL(74, 74, 74, 1.0)} forState:UIControlStateNormal];
//設置選中的文字顏色
[nav.tabBarItem setTitleTextAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:12],NSForegroundColorAttributeName:RGBCOL(159, 215, 5, 1.0)} forState:UIControlStateSelected];
[self addChildViewController:nav];
}
//重寫代理方法
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
if (self.selectedIndex==1) {
button.selected=YES;
}else
{
button.selected=NO;
}
}
@end