iOS-CYLTabBarController【好用的TabbarController】

1.導入CYLTabBarController

使用cocoapods導入即可 pod 'CYLTabBarController', '~> 1.14.1',終端 pod install 即可

2.配置

新建一個基于 NSObject 類?MainTabBarControllerConfig,用于配置CYLTabBarController及管理窗骑;頭文件引入

#import <CYLTabBarController.h>

.h

@interface MainTabBarControllerConfig : NSObject

///CYLTabBarController

@property (nonatomic,strong) CYLTabBarController *mainTabBarController;@end

.m

- (CYLTabBarController *)mainTabBarController{

? ? if (!_mainTabBarController) {

? ? ? ? UIEdgeInsets imageInsets = UIEdgeInsetsZero;

? ? ? ? UIOffset titlePositionAdjustment = UIOffsetZero;

? ? ? ? _mainTabBarController = [CYLTabBarController tabBarControllerWithViewControllers:[self arrayViewControllerItem] tabBarItemsAttributes:[self arrayAttributesItem] imageInsets:imageInsets titlePositionAdjustment:titlePositionAdjustment];

? ? ? ? [self customizeTabBarAppearance:_mainTabBarController];

? ? }

? ? return _mainTabBarController;

}

- (NSArray *)arrayViewControllerItem{

? ? UINavigationController *firstNav = [[UINavigationController alloc] initWithRootViewController:[FirstViewController new]];

? ? UINavigationController *secondNav = [[UINavigationController alloc] initWithRootViewController:[SecondViewController new]];

? ? UINavigationController *thirdNav = [[UINavigationController alloc] initWithRootViewController:[ThirdViewController new]];

? ? UINavigationController *lastNav = [[UINavigationController alloc] initWithRootViewController:[LastViewController new]];

? ? ///返回需要加載的模塊

? ? return @[firstNav,secondNav,thirdNav,lastNav];

}

- (NSArray *)arrayAttributesItem{

? ? NSDictionary *bookcaseItemsAttributes =@{CYLTabBarItemTitle : @"首頁",

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CYLTabBarItemImage : @"aa_unselect",

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* NSString and UIImage are supported*/

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CYLTabBarItemSelectedImage : @"aa_select",};


? ? NSDictionary *discoverItemsAttributes = @{CYLTabBarItemTitle : @"產(chǎn)品",

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CYLTabBarItemImage : @"bb_unselect",

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CYLTabBarItemSelectedImage : @"bb_select",};


? ? NSDictionary *askklItemsAttributes = @{CYLTabBarItemTitle : @"工具",

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CYLTabBarItemImage : @"cc_unselect",

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CYLTabBarItemSelectedImage : @"cc_select",};


? ? NSDictionary *userItemsAttributes = @{CYLTabBarItemTitle : @"我的",

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CYLTabBarItemImage : @"dd_unselect",

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CYLTabBarItemSelectedImage : @"dd_select"};


? ? NSArray *tabBarItemsAttributes = @[bookcaseItemsAttributes,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? discoverItemsAttributes,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? askklItemsAttributes,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? userItemsAttributes];

? ? return tabBarItemsAttributes;

}

/**

*? 更多TabBar自定義設置:比如:tabBarItem 的選中和不選中文字和背景圖片屬性、tabbar 背景圖片屬性等等

*/

- (void)customizeTabBarAppearance:(CYLTabBarController *)tabBarController {

? ? // Customize UITabBar height

? ? // 自定義 TabBar 高度

? ? //? ? tabBarController.tabBarHeight = CYLTabBarControllerHeight;


? ? // set the text color for unselected state

? ? // 普通狀態(tài)下的文字屬性

? ? NSMutableDictionary *normalAttrs = [NSMutableDictionary dictionary];

? ? normalAttrs[NSForegroundColorAttributeName] = [UIColor grayColor];


? ? // set the text color for selected state

? ? // 選中狀態(tài)下的文字屬性

? ? NSMutableDictionary *selectedAttrs = [NSMutableDictionary dictionary];

? ? selectedAttrs[NSForegroundColorAttributeName] = [UIColor greenColor];


? ? // set the text Attributes

? ? // 設置文字屬性

? ? UITabBarItem *tabBar = [UITabBarItem appearance];

? ? [tabBar setTitleTextAttributes:normalAttrs forState:UIControlStateNormal];

? ? [tabBar setTitleTextAttributes:selectedAttrs forState:UIControlStateSelected];


? ? // Set the dark color to selected tab (the dimmed background)

? ? // TabBarItem選中后的背景顏色

? ? // [self customizeTabBarSelectionIndicatorImage];


? ? // update TabBar when TabBarItem width did update

? ? // If your app need support UIDeviceOrientationLandscapeLeft or UIDeviceOrientationLandscapeRight,

? ? // remove the comment '//'

? ? // 如果你的App需要支持橫豎屏絮缅,請使用該方法移除注釋 '//'

? ? // [self updateTabBarCustomizationWhenTabBarItemWidthDidUpdate];


? ? // set the bar shadow image

? ? // This shadow image attribute is ignored if the tab bar does not also have a custom background image.So at least set somthing.

? ? [[UITabBar appearance] setBackgroundImage:[[UIImage alloc] init]];

? ? [[UITabBar appearance] setBackgroundColor:[UIColor whiteColor]];

? ? [[UITabBar appearance] setShadowImage:[UIImage imageNamed:@"tapbar_top_line"]];


? ? // set the bar background image

? ? // 設置背景圖片

? ? //? ? UITabBar *tabBarAppearance = [UITabBar appearance];

? ? //? ? [tabBarAppearance setBackgroundImage:[UIImage imageNamed:@"tab_bar"]];


? ? // remove the bar system shadow image

? ? // 去除 TabBar 自帶的頂部陰影

? ? // [[UITabBar appearance] setShadowImage:[[UIImage alloc] init]];

}

3.使用

在AppDelegate.m ?didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 方法中

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

? ? // Override point for customization after application launch.

? ? // 創(chuàng)建Window

? ? self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

? ? // 設置Window的背景顏色

? ? self.window.backgroundColor = [UIColor whiteColor];

? ? // 設置根控制器

? ? MainTabBarControllerConfig *tabbarConfig = [[MainTabBarControllerConfig alloc]init];

? ? CYLTabBarController *mainTabbarController = tabbarConfig.mainTabBarController;

? ? [self.window setRootViewController:mainTabbarController];

? ? // 設置并顯示主窗口

? ? [self.window makeKeyAndVisible];


? ? return YES;

}

4.自定義按鈕

加入中間按鈕之前,確保上面的功能已經(jīng)實現(xiàn)呼股;新建一個基于?CYLPlusButton 的類?TabbarPlusButton耕魄,實現(xiàn)代理?CYLPlusButtonSubclassing

.h

@interface TabbarPlusButton : CYLPlusButton<CYLPlusButtonSubclassing>@end

.m

@implementation TabbarPlusButton

- (instancetype)initWithFrame:(CGRect)frame {

? ? if (self = [super initWithFrame:frame]) {

? ? ? ? self.titleLabel.textAlignment = NSTextAlignmentCenter;

? ? ? ? self.adjustsImageWhenHighlighted = NO;

? ? }

? ? return self;

}

//上下結(jié)構(gòu)的 button

- (void)layoutSubviews {

? ? [super layoutSubviews];


? ? // 控件大小,間距大小

? ? // 注意:一定要根據(jù)項目中的圖片去調(diào)整下面的0.7和0.9,Demo之所以這么設置彭谁,因為demo中的 plusButton 的 icon 不是正方形吸奴。

? ? CGFloat const imageViewEdgeWidth? = self.bounds.size.width * 0.7;

? ? CGFloat const imageViewEdgeHeight? = imageViewEdgeWidth * 0.9;


? ? CGFloat const centerOfView? ? = self.bounds.size.width * 0.5;

? ? CGFloat const labelLineHeight = self.titleLabel.font.lineHeight;

? ? CGFloat const verticalMargin? = (self.bounds.size.height - labelLineHeight - imageViewEdgeHeight) * 0.5;


? ? // imageView 和 titleLabel 中心的 Y 值

? ? CGFloat const centerOfImageView? = verticalMargin + imageViewEdgeHeight * 0.5;

? ? CGFloat const centerOfTitleLabel = imageViewEdgeHeight? + verticalMargin * 2 + labelLineHeight * 0.5 + 5;


? ? //imageView position 位置

? ? self.imageView.bounds = CGRectMake(0, 0, imageViewEdgeWidth, imageViewEdgeHeight);

? ? self.imageView.center = CGPointMake(centerOfView, centerOfImageView);


? ? //title position 位置

? ? self.titleLabel.bounds = CGRectMake(0, 0, self.bounds.size.width, labelLineHeight);

? ? self.titleLabel.center = CGPointMake(centerOfView, centerOfTitleLabel);

}

#pragma mark -

#pragma mark - CYLPlusButtonSubclassing Methods

/*

*

Create a custom UIButton with title and add it to the center of our tab bar

*

*/

+ (id)plusButton {

? ? TabbarPlusButton *button = [[TabbarPlusButton alloc] init];

? ? ///中間按鈕圖片

? ? UIImage *buttonImage = [UIImage imageNamed:@"post_normal"];

? ? [button setImage:buttonImage forState:UIControlStateNormal];

? ? [button setTitle:@"發(fā)布" forState:UIControlStateNormal];

? ? [button setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];


? ? [button setTitle:@"發(fā)布" forState:UIControlStateSelected];

? ? [button setTitleColor:[UIColor blueColor] forState:UIControlStateSelected];


? ? button.titleLabel.font = [UIFont systemFontOfSize:9.5];

? ? [button sizeToFit]; // or set frame in this way `button.frame = CGRectMake(0.0, 0.0, 250, 100);`

? ? //? ? button.frame = CGRectMake(0.0, 0.0, 250, 100);

? ? //? ? button.backgroundColor = [UIColor redColor];


? ? // if you use `+plusChildViewController` , do not addTarget to plusButton.

? ? [button addTarget:button action:@selector(clickPublish) forControlEvents:UIControlEventTouchUpInside];

? ? return button;

}

/*

*

Create a custom UIButton without title and add it to the center of our tab bar

*

*/

//+ (id)plusButton

//{

//

//? ? UIImage *buttonImage = [UIImage imageNamed:@"hood.png"];

//? ? UIImage *highlightImage = [UIImage imageNamed:@"hood-selected.png"];

//

//? ? CYLPlusButtonSubclass* button = [CYLPlusButtonSubclass buttonWithType:UIButtonTypeCustom];

//

//? ? button.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleTopMargin;

//? ? button.frame = CGRectMake(0.0, 0.0, buttonImage.size.width, buttonImage.size.height);

//? ? [button setBackgroundImage:buttonImage forState:UIControlStateNormal];

//? ? [button setBackgroundImage:highlightImage forState:UIControlStateHighlighted];

//? ? [button addTarget:button action:@selector(clickPublish) forControlEvents:UIControlEventTouchUpInside];

//

//? ? return button;

//}

#pragma mark -

#pragma mark - Event Response

- (void)clickPublish {

? ? CYLTabBarController *tabBarController = [self cyl_tabBarController];

? ? UIViewController *viewController = tabBarController.selectedViewController;


? ? UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:nil

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? delegate:nil

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cancelButtonTitle:@"取消"

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? destructiveButtonTitle:nil

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? otherButtonTitles:@"拍照", @"從相冊選取", @"淘寶一鍵轉(zhuǎn)賣", nil];

? ? [actionSheet showInView:viewController.view];

}

#pragma mark - UIActionSheetDelegate

- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex {

? ? NSLog(@"buttonIndex = %@", @(buttonIndex));

}

#pragma mark - CYLPlusButtonSubclassing

//+ (UIViewController *)plusChildViewController {

//? ? UIViewController *plusChildViewController = [[UIViewController alloc] init];

//? ? plusChildViewController.view.backgroundColor = [UIColor redColor];

//? ? plusChildViewController.navigationItem.title = @"PlusChildViewController";

//? ? UIViewController *plusChildNavigationController = [[UINavigationController alloc]

//? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? initWithRootViewController:plusChildViewController];

//? ? return plusChildNavigationController;

//}

//

//+ (NSUInteger)indexOfPlusButtonInTabBar {

//? ? return 4;

//}

//

//+ (BOOL)shouldSelectPlusChildViewController {

//? ? BOOL isSelected = CYLExternPlusButton.selected;

//? ? if (isSelected) {

//? ? ? ? NSLog(@"??類名與方法名:%@(在第%@行),描述:%@", @(__PRETTY_FUNCTION__), @(__LINE__), @"PlusButton is selected");

//? ? } else {

//? ? ? ? NSLog(@"??類名與方法名:%@(在第%@行)缠局,描述:%@", @(__PRETTY_FUNCTION__), @(__LINE__), @"PlusButton is not selected");

//? ? }

//? ? return YES;

//}

+ (CGFloat)multiplierOfTabBarHeight:(CGFloat)tabBarHeight {

? ? return? 0.3;

}

+ (CGFloat)constantOfPlusButtonCenterYOffsetForTabBarHeight:(CGFloat)tabBarHeight {

? ? return? -10;

}

@end

最后在AppDelegate.m ?didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 方法中加上?[TabbarPlusButton registerPlusButton] 即可;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

? ? // Override point for customization after application launch.

[TabbarPlusButton registerPlusButton]

? ? // 創(chuàng)建Window

? ? self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

? ? // 設置Window的背景顏色

? ? self.window.backgroundColor = [UIColor whiteColor];

? ? // 設置根控制器

? ? MainTabBarControllerConfig *tabbarConfig = [[MainTabBarControllerConfig alloc]init];

? ? CYLTabBarController *mainTabbarController = tabbarConfig.mainTabBarController;

? ? [self.window setRootViewController:mainTabbarController];

? ? // 設置并顯示主窗口

? ? [self.window makeKeyAndVisible];


? ? return YES;

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末则奥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子狭园,更是在濱河造成了極大的恐慌读处,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唱矛,死亡現(xiàn)場離奇詭異档泽,居然都是意外死亡俊戳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門馆匿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人燥滑,你說我怎么就攤上這事渐北。” “怎么了铭拧?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵赃蛛,是天一觀的道長。 經(jīng)常有香客問我搀菩,道長呕臂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任肪跋,我火速辦了婚禮歧蒋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘州既。我一直安慰自己谜洽,他們只是感情好,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布吴叶。 她就那樣靜靜地躺著阐虚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蚌卤。 梳的紋絲不亂的頭發(fā)上实束,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機與錄音逊彭,去河邊找鬼咸灿。 笑死,一個胖子當著我的面吹牛诫龙,可吹牛的內(nèi)容都是我干的析显。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼签赃,長吁一口氣:“原來是場噩夢啊……” “哼谷异!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起锦聊,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤歹嘹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后孔庭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尺上,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡材蛛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了怎抛。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卑吭。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖马绝,靈堂內(nèi)的尸體忽然破棺而出豆赏,到底是詐尸還是另有隱情,我是刑警寧澤富稻,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布掷邦,位于F島的核電站,受9級特大地震影響椭赋,放射性物質(zhì)發(fā)生泄漏抚岗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一哪怔、第九天 我趴在偏房一處隱蔽的房頂上張望宣蔚。 院中可真熱鬧,春花似錦蔓涧、人聲如沸件已。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽篷扩。三九已至,卻和暖如春茉盏,著一層夾襖步出監(jiān)牢的瞬間鉴未,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工鸠姨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留铜秆,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓讶迁,卻偏偏與公主長得像连茧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子巍糯,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容