iOS 自定义选项卡-CYLTabBarController
正常的选项卡流程
cocoapods就不说了
创建一个CYLTabBarControllerConfig类
#import <Foundation/Foundation.h>
#import "CYLTabBarController.h"
@interface CYLTabBarControllerConfig : NSObject
@property (nonatomic, readonly, strong) CYLTabBarController *tabBarController;
@end
#import "CYLTabBarControllerConfig.h"
@import Foundation;
@import UIKit;
@interface CYLBaseNavigationController : UINavigationController
@end
@implementation CYLBaseNavigationController - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
if (self.viewControllers.count > ) {
viewController.hidesBottomBarWhenPushed = YES;
}
[super pushViewController:viewController animated:animated];
} @end //View Controllers
#import "HandleViewController.h"
#import "EnquiriesViewController.h"
#import "ConsultViewController.h"
#import "ManagerViewController.h"
#import "ErectViewController.h" @interface CYLTabBarControllerConfig () @property (nonatomic, readwrite, strong) CYLTabBarController *tabBarController; @end @implementation CYLTabBarControllerConfig
/**
* lazy load tabBarController
*
* @return CYLTabBarController
*/
- (CYLTabBarController *)tabBarController {
if (_tabBarController == nil) {
HandleViewController *firstViewController = [[HandleViewController alloc] init];
UIViewController *firstNavigationController = [[CYLBaseNavigationController alloc]
initWithRootViewController:firstViewController]; EnquiriesViewController *secondViewController = [[EnquiriesViewController alloc] init];
UIViewController *secondNavigationController = [[CYLBaseNavigationController alloc]
initWithRootViewController:secondViewController];
/**
* 选项卡右上角的数字
*/
// secondNavigationController.tabBarItem.badgeValue = @"10"; ConsultViewController *thirdViewController = [[ConsultViewController alloc] init];
UIViewController *thirdNavigationController = [[CYLBaseNavigationController alloc]
initWithRootViewController:thirdViewController]; ManagerViewController *fourthViewController = [[ManagerViewController alloc] init];
UIViewController *fourthNavigationController = [[CYLBaseNavigationController alloc]
initWithRootViewController:fourthViewController];
ErectViewController *fifthViewControll = [[ErectViewController alloc]init];
UIViewController *fifthNavigationController = [[CYLBaseNavigationController alloc]initWithRootViewController:fifthViewControll]; CYLTabBarController *tabBarController = [[CYLTabBarController alloc] init]; /**
* 以下两行代码目的在于手动设置让TabBarItem只显示图标,不显示文字,并让图标垂直居中。
* 等效于在`-setUpTabBarItemsAttributesForController`方法中不传`CYLTabBarItemTitle`字段。
* 更推荐后一种做法。
*/
//tabBarController.imageInsets = UIEdgeInsetsMake(4.5, 0, -4.5, 0);
//tabBarController.titlePositionAdjustment = UIOffsetMake(0, MAXFLOAT); // 在`-setViewControllers:`之前设置TabBar的属性,设置TabBarItem的属性,包括 title、Image、selectedImage。
[self setUpTabBarItemsAttributesForController:tabBarController]; [tabBarController setViewControllers:@[
firstNavigationController,
secondNavigationController,
thirdNavigationController,
fourthNavigationController,
fifthNavigationController
]];
// 更多TabBar自定义设置:比如:tabBarItem 的选中和不选中文字和背景图片属性、tabbar 背景图片属性
[self customizeTabBarAppearance:tabBarController];
_tabBarController = tabBarController;
}
return _tabBarController;
} /**
* 在`-setViewControllers:`之前设置TabBar的属性,设置TabBarItem的属性,包括 title、Image、selectedImage。
*/
- (void)setUpTabBarItemsAttributesForController:(CYLTabBarController *)tabBarController { NSDictionary *dict1 = @{
CYLTabBarItemTitle : @"订单处理",
CYLTabBarItemImage : @"tab_dingdanchuli",
CYLTabBarItemSelectedImage : @"tab_dingdanchuli_s",
};
NSDictionary *dict2 = @{
CYLTabBarItemTitle : @"订单查询",
CYLTabBarItemImage : @"tab_dingdanchaxun",
CYLTabBarItemSelectedImage : @"tab_dingdanchaxun_s",
};
NSDictionary *dict3 = @{
CYLTabBarItemTitle : @"咨询",
CYLTabBarItemImage : @"tab_xiaoxi",
CYLTabBarItemSelectedImage : @"tab_xiaoxi_s",
};
NSDictionary *dict4 = @{
CYLTabBarItemTitle : @"门店管理",
CYLTabBarItemImage : @"tab_mendianguanli",
CYLTabBarItemSelectedImage : @"tab_mendianguanli_s"
};
NSDictionary *dict5 = @{
CYLTabBarItemTitle : @"设置",
CYLTabBarItemImage : @"tab_shezhi",
CYLTabBarItemSelectedImage : @"tab_shezhi_s"
};
NSArray *tabBarItemsAttributes = @[
dict1,
dict2,
dict3,
dict4,
dict5
];
tabBarController.tabBarItemsAttributes = tabBarItemsAttributes;
} /**
* 更多TabBar自定义设置:比如:tabBarItem 的选中和不选中文字和背景图片属性、tabbar 背景图片属性
*/
- (void)customizeTabBarAppearance:(CYLTabBarController *)tabBarController {
// Customize UITabBar height
// 自定义 TabBar 高度
// tabBarController.tabBarHeight = 80.f; // 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] = RGBColor(, , ); // 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:@"tabbar_background"]]; // remove the bar system shadow image
// 去除 TabBar 自带的顶部阴影
// [[UITabBar appearance] setShadowImage:[[UIImage alloc] init]];
} - (void)updateTabBarCustomizationWhenTabBarItemWidthDidUpdate {
void (^deviceOrientationDidChangeBlock)(NSNotification *) = ^(NSNotification *notification) {
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
if ((orientation == UIDeviceOrientationLandscapeLeft) || (orientation == UIDeviceOrientationLandscapeRight)) {
NSLog(@"Landscape Left or Right !");
} else if (orientation == UIDeviceOrientationPortrait){
NSLog(@"Landscape portrait!");
}
[self customizeTabBarSelectionIndicatorImage];
};
[[NSNotificationCenter defaultCenter] addObserverForName:CYLTabBarItemWidthDidChangeNotification
object:nil
queue:[NSOperationQueue mainQueue]
usingBlock:deviceOrientationDidChangeBlock];
} - (void)customizeTabBarSelectionIndicatorImage {
///Get initialized TabBar Height if exists, otherwise get Default TabBar Height.
UITabBarController *tabBarController = [self cyl_tabBarController] ?: [[UITabBarController alloc] init];
CGFloat tabBarHeight = tabBarController.tabBar.frame.size.height;
CGSize selectionIndicatorImageSize = CGSizeMake(CYLTabBarItemWidth, tabBarHeight);
//Get initialized TabBar if exists.
UITabBar *tabBar = [self cyl_tabBarController].tabBar ?: [UITabBar appearance];
[tabBar setSelectionIndicatorImage:
[[self class] imageWithColor:[UIColor redColor]
size:selectionIndicatorImageSize]];
} + (UIImage *)imageWithColor:(UIColor *)color size:(CGSize)size {
if (!color || size.width <= || size.height <= ) return nil;
CGRect rect = CGRectMake(0.0f, 0.0f, size.width + , size.height);
UIGraphicsBeginImageContextWithOptions(rect.size, NO, );
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, color.CGColor);
CGContextFillRect(context, rect);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
} - (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
另外还有自定义的加号按钮
要创建一个CYLPlusButton的类不要忘了加上CYLPlusButtonSubclassing协议
#import <CYLTabBarController/CYLTabBarController.h> @interface CYLPlusButtonSubclass : CYLPlusButton<CYLPlusButtonSubclassing,UIActionSheetDelegate> @end
#import "CYLPlusButtonSubclass.h"
#import <CYLTabBarController.h> @implementation CYLPlusButtonSubclass +(void)load{
[super registerSubclass];
} - (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
self.titleLabel.textAlignment = NSTextAlignmentCenter;
self.adjustsImageWhenHighlighted = NO; }
return self;
}
//上下结构的 button
- (void)layoutSubviews {
[super layoutSubviews]; // 控件大小,间距大小
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 verticalMarginT = self.bounds.size.height - labelLineHeight - imageViewEdgeWidth;
CGFloat const verticalMargin = verticalMarginT / ; // imageView 和 titleLabel 中心的 Y 值
CGFloat const centerOfImageView = verticalMargin + imageViewEdgeWidth * 0.5;
CGFloat const centerOfTitleLabel = imageViewEdgeWidth + verticalMargin * + labelLineHeight * 0.5 + ; //imageView position 位置
self.imageView.bounds = CGRectMake(, , imageViewEdgeWidth, imageViewEdgeHeight);
self.imageView.center = CGPointMake(centerOfView, centerOfImageView); //title position 位置
self.titleLabel.bounds = CGRectMake(, , self.bounds.size.width, labelLineHeight);
self.titleLabel.center = CGPointMake(centerOfView, centerOfTitleLabel);
}
/*
*
Create a custom UIButton with title and add it to the center of our tab bar
*
*/
+ (id)plusButton {
CYLPlusButtonSubclass *button = [[CYLPlusButtonSubclass 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 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;
//}
- (void)clickPublish {
CYLTabBarController *tabBarController = [self cyl_tabBarController];
UIViewController *viewController = tabBarController.selectedViewController;
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:nil
delegate:nil
cancelButtonTitle:@"取消"
destructiveButtonTitle:nil
otherButtonTitles:@"拍照", @"从相册选取", @"淘宝一键转卖", nil];
[actionSheet showInView:viewController.view];
NSLog(@"发布");
}
#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 ;
}
+ (CGFloat)multiplerInCenterY {
return 0.3;
}
如果正常按钮数目是奇数的话 要实现
+ (NSUInteger)indexOfPlusButtonInTabBar {
return ;
}
如何调整、自定义 PlusButton
与其它 TabBarItem
的宽度?
CYLTabBarController
规定:
TabBarItem 宽度 = ( TabBar 总宽度 - PlusButton 宽度 ) / (TabBarItem 个数)
所以想自定义宽度,只需要修改 PlusButton
的宽度即可。
比如你就可以在 Demo中的 CYLPlusButtonSubclass.m
类里:
把
[button sizeToFit]
改为
button.frame = CGRectMake(0.0, 0.0, , );
---------------
如果要把加号按钮做成跟其他按钮的点击效果一样的话需要同时实现这两个方法
+ (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 ;
}
之前不知道怎么回事,出了些莫名其妙的问题。。记录下
前人种树后人乘凉啊!感谢原作作者
iOS 自定义选项卡-CYLTabBarController的更多相关文章
- 【iOS自定义键盘及键盘切换】详解
[iOS自定义键盘]详解 实现效果展示: 一.实现的协议方法代码 #import <UIKit/UIKit.h> //创建自定义键盘协议 @protocol XFG_KeyBoardDel ...
- iOS自定义的UISwitch按钮
UISwitch开关控件 开关代替了点选框.开关是到目前为止用起来最简单的控件,不过仍然可以作一定程度的定制化. 一.创建 UISwitch* mySwitch = [[ UISwitchalloc] ...
- 如何实现 iOS 自定义状态栏
给大家介绍如何实现 iOS 自定义状态栏 Sample Code: 01 UIWindow * statusWindow = [[UIWindow alloc] initWithFrame:[UIAp ...
- excel快速访问工具栏和自定义选项卡
自定义选项卡: excel命令选项--自定义功能区--
- iOS自定义组与组之间的距离以及视图
iOS自定义组与组之间的距离以及视图 //头视图高度 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(N ...
- iOS 自定义转场动画
代码地址如下:http://www.demodashi.com/demo/12955.html 一.总效果 本文记录分享下自定义转场动画的实现方法,具体到动画效果:新浪微博图集浏览转场效果.手势过渡动 ...
- iOS 自定义转场动画浅谈
代码地址如下:http://www.demodashi.com/demo/11612.html 路漫漫其修远兮,吾将上下而求索 前记 想研究自定义转场动画很久了,时间就像海绵,挤一挤还是有的,花了差不 ...
- iOS自定义转场动画实战讲解
iOS自定义转场动画实战讲解 转场动画这事,说简单也简单,可以通过presentViewController:animated:completion:和dismissViewControllerA ...
- SWT自定义选项卡CTabFolder
SWT自定义选项卡CTabFolder 学习了:http://blog.csdn.net/dreajay/article/details/17391731 package com.swt; impor ...
随机推荐
- 异步函数封装请确保异步性(Javascript需要养成的良好习惯)
背景假设: 你有许多的配置信息存放在服务器上,因为配置太多,不希望每次都把所有的配置信息都写到前端,希望能需要用的时候再获取就好了. 因为Javascript单线程运行,你不希望堵塞ui渲染于是你专门 ...
- onethinkp导入excel
/** * Excel导入函数 * @author crx349 */ if (!empty($_FILES)) { $config = array( 'maxSize' => 3145728, ...
- 专家解读:BPM与OA的区别
演进历程 传统OA 模块化架构,仅能满足管理执行的刚性效率,系统的专业化程度有限. BPM 平台化架构,管理要求精细化程度高,系统更专业化,更注重整合. BPM SAAS 基于云架构,跨组织社交化,系 ...
- SQL Server 检测到基于一致性的逻辑 I/O 错误 校验和不正确 ||尝试在数据库 5 中提取逻辑页 (1:1640) 失败
use test go ALTER DATABASE test SET SINGLE_USER DBCC CHECKDB (test, repair_allow_data_loss) with NO_ ...
- 例子:Basic Lens sample
本例演示了如何自己扩展一个Camera Lens. 1. UI界面是一个MediaViewer <controls:MediaViewer x:Name="MediaViewer&qu ...
- 设计模式之observer and visitor
很长时间一直对observer(观察者)与visitor(访问者)有些分不清晰. 今天有时间进行一下梳理: 1.observer模式 这基本就是一个通知模式,当被观察者发生改变时,通知所有监听此变化的 ...
- 微软MVP衣明志告诉你,小白全方位攻略,逆袭互联网达人
技术专家们的起步之路是不尽相同的,今天我们要介绍的衣明志老师就是一个从普通游戏爱好者修炼成的技术大咖.尽管当时遇到了不少的困难,但是努力坚持自己解决问题让衣明志老师在技术之路上有了自己的特点. 我们先 ...
- 一些Layout的坑。坑死我自己了
iOS这个东西,初学感觉,还好还好,然后一年之后再来修复一下初学的时候的代码,我只是感觉头很晕- - 别扶我. AutoLayout的坑,明明以前都没有的!!!升了iOS10就突然发现了这个坑,其实也 ...
- 【zz】matlab 求差集
matlab判断2个数组中不同元素--setdiff c = setdiff(A, B) 返回在A中有,而B中没有的值,结果向量将以升序排序返回.在集合论中,c = A - B.A和B也可以是字符串细 ...
- Android开源框架:Universal-Image-Loader解析(四)TaskProcess
Universal-Image-Loader中,对Task的处理有两种方法:FIFO,LIFO 在core/assist下的deque包中,其主要是定义了LIFOLinkedBlockingDeque ...