用TabbarController进行模块分类和管理,这里推荐一个CYLTabBarController,只需两个数组就可以使用和管理;

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

@implementation MainTabBarControllerConfig- (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{BookcaseNavViewController *bookcaseNavi = [wkj_getSboardBookcase instantiateViewControllerWithIdentifier:@"BookcaseNavViewController"];AskKaoLaNavViewController *askKlNavi = [wkj_getSboardAskKaoLa instantiateViewControllerWithIdentifier:@"AskKaoLaNavViewController"];DiscoverNavViewController *discoverNavi = [wkj_getSboardDiscover instantiateViewControllerWithIdentifier:@"DiscoverNavViewController"];UserNavViewController *userNavi = [wkj_getSboardUser instantiateViewControllerWithIdentifier:@"UserNavViewController"];///返回需要加载的模块return @[bookcaseNavi,discoverNavi,askKlNavi,userNavi];
}- (NSArray *)arrayAttributesItem{NSDictionary *bookcaseItemsAttributes =@{CYLTabBarItemTitle : @"nav1",CYLTabBarItemImage : @"bar_tk_01",/* NSString and UIImage are supported*/CYLTabBarItemSelectedImage : @"bar_tk_02",};NSDictionary *discoverItemsAttributes = @{CYLTabBarItemTitle : @"nav2",CYLTabBarItemImage : @"bar_kc_01",CYLTabBarItemSelectedImage : @"bar_kc_02",};NSDictionary *askklItemsAttributes = @{CYLTabBarItemTitle : @"nav3",CYLTabBarItemImage : @"bar_dzs_01",CYLTabBarItemSelectedImage : @"bar_dzs_02",};NSDictionary *userItemsAttributes = @{CYLTabBarItemTitle : @"nav4",CYLTabBarItemImage : @"bar_wd_01",CYLTabBarItemSelectedImage : @"bar_wd_02"};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// 普通状态下的文字属性NSMutableDictionary *normalAttrs = [NSMutableDictionary dictionary];normalAttrs[NSForegroundColorAttributeName] = [UIColor grayColor];// set the text color for selected state// 选中状态下的文字属性NSMutableDictionary *selectedAttrs = [NSMutableDictionary dictionary];selectedAttrs[NSForegroundColorAttributeName] = Wonderful_BlueColor6;// 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.
//    /加载中间自定义按钮
//    [TabbarPlusButton registerPlusButton];MainTabBarControllerConfig *tabbarConfig = [[MainTabBarControllerConfig alloc]init];CYLTabBarController *mainTabbarController = tabbarConfig.mainTabBarController;[self.window setRootViewController:mainTabbarController];return YES;
}

4.自定义按钮

加入中间按钮之前,确保上面的功能已经实现;新建一个基于 CYLPlusButton 的类 TabbarPlusButton,实现代理 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;
}//上下结构的 button
- (void)layoutSubviews {[super layoutSubviews];// 控件大小,间距大小// 注意:一定要根据项目中的图片去调整下面的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:@"发布" forState:UIControlStateNormal];[button setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];[button setTitle:@"发布" 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:nildelegate:nilcancelButtonTitle:@"取消"destructiveButtonTitle:nilotherButtonTitles:@"拍照", @"从相册选取", @"淘宝一键转卖", 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];MainTabBarControllerConfig *tabbarConfig = [[MainTabBarControllerConfig alloc]init];CYLTabBarController *mainTabbarController = tabbarConfig.mainTabBarController;[self.window setRootViewController:mainTabbarController];return YES;
}

转载于:https://www.cnblogs.com/wangkejia/p/7943415.html

iOS-CYLTabBarController【好用的TabbarController】相关推荐

  1. [分享]iOS开发-如何使用tabBarController

    由于难度不大,直接上代码了,看一遍基本就明白思路了 1.创建一个tabBarViewController .m文件 #import "SSTabBarViewController.h&quo ...

  2. iOS 第三方 汇总

    开源项目 iOSBlogAndToolsiOS开发优秀博客和软件推荐 CodeHubbrowse and maintain your GitHub repositories on any iOS de ...

  3. iOS开发常用三方库、插件、知名博客

    TimLiu-iOS iOS开发常用三方库.插件.知名博客等等,期待大家和我们一起共同维护,同时也期望大家随时能提出宝贵的意见(直接提交Issues即可). 持续更新... 版本:Objective- ...

  4. iOS最全的三方库、插件、博客汇总

    目录 UI@ 日历三方库@ 下拉刷新@ 模糊效果@ 富文本@ 图表@ 颜色@ 表相关@(TabbleView.Tabbar.即时聊天界面) TableView@ CollectionView@ 隐藏与 ...

  5. iOS网络资源汇总(值得推荐)

    目录 下拉刷新 模糊效果 AutoLayout 富文本 图表 表相关与Tabbar 隐藏与显示 HUD与Toast 对话框 其他UI 具体内容 下拉刷新 EGOTableViewPullRefresh ...

  6. 常用的iOS第三方框架

    转载自:https://github.com/Tim9Liu9/TimLiu-iOS 目录 UI 下拉刷新 模糊效果 AutoLayout 富文本 图表 表相关与Tabbar 隐藏与显示 HUD与To ...

  7. IOS 常用UI控件

    目录 下拉刷新 模糊效果 AutoLayout 富文本 图表 表相关与Tabbar 隐藏与显示 HUD与Toast 对话框 其他UI 具体内容 下拉刷新 EGOTableViewPullRefresh ...

  8. iOS 网络资源汇总之UI

    目录 下拉刷新 模糊效果 AutoLayout 富文本 图表 表相关与Tabbar 隐藏与显示 HUD与Toast 对话框 其他UI 具体内容 下拉刷新 EGOTableViewPullRefresh ...

  9. ios非常全的库iOS开发 非常全的三方库、插件、大牛博客等等

    转自: TimLiu-iOS Swift版本点击这里欢迎加入交QQ流群: 594119878 github排名 https://github.com/trending,github搜索:https:/ ...

  10. iOS可能用到的开源库和第三方组件

    1.通过CocoaPods安装 [AFNetworking](https://github.com/AFNetworking/AFNetworking) 网络请求组件[FMDB](https://gi ...

最新文章

  1. Linux平台下的内存泄漏检测
  2. JAVA Thread线程异常监控
  3. 【资源】C++学习资料 - 逆天整理 - 精华无密版【最新】
  4. MYsql:net start mysql 失败 发生系统错误5
  5. 认识python编程环境_认识Python和安装Python环境
  6. DNS域名系统的几个基础概念
  7. Windows UI风格的设计(11)
  8. 企业级数据库备份方案完全攻略
  9. 诗和远方:无题(五十一)
  10. mysql+磁盘i+o+优化_浅析MySQL数据库磁盘I/O调整优化 | 学步园
  11. 移动端动画使用transform提升性能
  12. js 实现PHP中的in_array()
  13. 利用工具,促进有效沟通
  14. java web表单系统
  15. 20230411笔记-MTK天玑开发者日(北京站)
  16. 自己感觉比较不错的美剧(记录自己追剧的岁月)
  17. Google Open Images Dataset V4 百度网盘地址。
  18. java面向对象程序设计的六大基本原则
  19. mysql 梭镖_FreeBSD.6.2服务器架设视频教程下载_IT教程网
  20. 关于RF射频 PCB布线心得

热门文章

  1. 【BZOJ1001】狼抓兔子
  2. Mathematica学习(2)-mathematica命令
  3. 100base-fx 单模/多模接口是什么意思
  4. 超详细实现淘宝静态页面(附全部代码)
  5. 【Python常见 面试题】实现三位数的水仙花数,Python入门案例学习
  6. OpenCV resize 改变图片大小,4种方式原理对比
  7. 困扰所有SAP顾问多年的问题终于解决了
  8. android rom结构_如何将新的ROM刷新到您的Android手机
  9. oracle回撤,Oracle使用排列组合计算最大回撤幅度
  10. tensorflow——模型的保存和恢复tf.trian.saver()