今天在GitHub上找了一个TabBar的轮子,Star 6.5k还不错,日常开发已经够用了,设置图片,选中图片,文本颜色,选中文本颜色,数字角标,选中动画,中间凸起按钮都有,日常开发已经够用了。具体可以去GitHub上看文档。
CYLTabBarController
自己写的Demo
使用也很简单
#import "MainTabBarController.h"
#import "AHomeController.h"
#import "BHomeController.h"
#import "CHomeController.h"
#import "DHomeController.h"
#import "CYLPlusButtonSubclass.h"
@interface MainTabBarController ()<UITabBarControllerDelegate>
@end
@implementation MainTabBarController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
}
- (instancetype)initTabBar{
// 中间异形按钮
[CYLPlusButtonSubclass registerPlusButton];
/**
* 以下两行代码目的在于手动设置让TabBarItem只显示图标,不显示文字,并让图标垂直居中。
* 等 效于在 `-tabBarItemsAttributesForController` 方法中不传 `CYLTabBarItemTitle` 字段。
* 更推荐后一种做法。
*/
UIEdgeInsets imageInsets = UIEdgeInsetsZero;//UIEdgeInsetsMake(4.5, 0, -4.5, 0);
UIOffset titlePositionAdjustment = UIOffsetMake(0, -3.5);
if (self = [super initWithViewControllers:[self viewControllersForTabBar]
tabBarItemsAttributes:[self tabBarItemsAttributesForTabBar]
imageInsets:imageInsets
titlePositionAdjustment:titlePositionAdjustment
context:@""
]) {
[self customizeTabBarAppearanceWithTitlePositionAdjustment:titlePositionAdjustment];
self.delegate = self;
self.navigationController.navigationBar.hidden = YES;
}
return self;
}
- (NSArray *)viewControllersForTabBar {
AHomeController *firstViewController = [[AHomeController alloc] init];
firstViewController.title = @"首页";
UIViewController *firstNavigationController = [[CYLBaseNavigationController alloc]
initWithRootViewController:firstViewController];
BHomeController *secondViewController = [[BHomeController alloc] init];
UIViewController *secondNavigationController = [[CYLBaseNavigationController alloc]
initWithRootViewController:secondViewController];
CHomeController *thirdViewController = [[CHomeController alloc] init];
UIViewController *thirdNavigationController = [[CYLBaseNavigationController alloc]
initWithRootViewController:thirdViewController];
DHomeController *fourthViewController = [[DHomeController alloc] init];
UIViewController *fourthNavigationController = [[CYLBaseNavigationController alloc]
initWithRootViewController:fourthViewController];
NSArray *viewControllers = @[
firstNavigationController,
secondNavigationController,
thirdNavigationController,
fourthNavigationController
];
return viewControllers;
}
- (NSArray *)tabBarItemsAttributesForTabBar {
// lottie动画的json文件来自于NorthSea, respect!
NSDictionary *firstTabBarItemsAttributes = @{
CYLTabBarItemTitle : @"首页",
CYLTabBarItemImage : [UIImage imageNamed:@"home_normal"],
CYLTabBarItemSelectedImage : @"home_highlight",
CYLTabBarItemTitlePositionAdjustment: [NSValue valueWithUIOffset:UIOffsetMake(0, 1)],//设置文本与图片的Position
};
NSDictionary *secondTabBarItemsAttributes = @{
CYLTabBarItemTitle : @"鱼塘",
CYLTabBarItemImage : [UIImage imageNamed:@"fishpond_normal"],
CYLTabBarItemSelectedImage : @"fishpond_highlight",
CYLTabBarItemTitlePositionAdjustment: [NSValue valueWithUIOffset:UIOffsetMake(0, 1)],//设置文本与图片的Position
};
NSDictionary *thirdTabBarItemsAttributes = @{
CYLTabBarItemTitle : @"消息",
CYLTabBarItemImage : [UIImage imageNamed:@"message_normal"],
CYLTabBarItemSelectedImage : @"message_highlight",
CYLTabBarItemTitlePositionAdjustment: [NSValue valueWithUIOffset:UIOffsetMake(0, 1)],//设置文本与图片的Position
};
NSDictionary *fourthTabBarItemsAttributes = @{
CYLTabBarItemTitle : @"我的",
CYLTabBarItemImage :[UIImage imageNamed:@"account_normal"],
CYLTabBarItemSelectedImage : @"account_highlight",
CYLTabBarItemTitlePositionAdjustment: [NSValue valueWithUIOffset:UIOffsetMake(0, 1)],//设置文本与图片的Position
};
NSArray *tabBarItemsAttributes = @[
firstTabBarItemsAttributes,
secondTabBarItemsAttributes,
thirdTabBarItemsAttributes,
fourthTabBarItemsAttributes
];
return tabBarItemsAttributes;
}
/**
* 更多TabBar自定义设置:比如:tabBarItem 的选中和不选中文字和背景图片属性、tabbar 背景图片属性等等
*/
- (void)customizeTabBarAppearanceWithTitlePositionAdjustment:(UIOffset)titlePositionAdjustment {
// Customize UITabBar height
// 自定义 TabBar 高度
// tabBarController.tabBarHeight = CYL_IS_IPHONE_X ? 65 : 40;
[self rootWindow].backgroundColor = [UIColor cyl_systemBackgroundColor];
// set the text color for unselected state
// 普通状态下的文字属性
NSMutableDictionary *normalAttrs = [NSMutableDictionary dictionary];
normalAttrs[NSForegroundColorAttributeName] = [UIColor cyl_systemGrayColor];
//normalAttrs[NSFontAttributeName] = [UIFont systemFontOfSize:10];
// set the text color for selected state
// 选中状态下的文字属性
NSMutableDictionary *selectedAttrs = [NSMutableDictionary dictionary];
selectedAttrs[NSForegroundColorAttributeName] = [UIColor cyl_labelColor];
if (@available(iOS 13.0, *)) {
UITabBarItemAppearance *inlineLayoutAppearance = [[UITabBarItemAppearance alloc] init];
inlineLayoutAppearance.normal.titlePositionAdjustment = titlePositionAdjustment;
// set the text Attributes
// 设置文字属性
[inlineLayoutAppearance.normal setTitleTextAttributes:normalAttrs];
[inlineLayoutAppearance.selected setTitleTextAttributes:selectedAttrs];
UITabBarAppearance *standardAppearance = [[UITabBarAppearance alloc] init];
standardAppearance.stackedLayoutAppearance = inlineLayoutAppearance;
standardAppearance.backgroundColor = [UIColor cyl_systemBackgroundColor];
//shadowColor和shadowImage均可以自定义颜色, shadowColor默认高度为1, shadowImage可以自定义高度.
// standardAppearance.shadowColor = [UIColor cyl_systemGreenColor];
// standardAppearance.shadowImage = [[self class] imageWithColor:[UIColor cyl_systemGreenColor] size:CGSizeMake([UIScreen mainScreen].bounds.size.width, 1)];
self.tabBar.standardAppearance = standardAppearance;
} else {
// Override point for customization after application launch.
// set the text Attributes
// 设置文字属性
UITabBarItem *tabBar = [UITabBarItem appearance];
[tabBar setTitleTextAttributes:normalAttrs forState:UIControlStateNormal];
[tabBar setTitleTextAttributes:selectedAttrs forState:UIControlStateSelected];
// 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] setShadowImage:[[self class] imageWithColor:[UIColor cyl_systemGreenColor] size:CGSizeMake([UIScreen mainScreen].bounds.size.width, 1)]];
}
}
//TabBar点击事件
- (void)tabBarController:(UITabBarController *)tabBarController didSelectControl:(UIControl *)control {
UIView *animationView = [control cyl_tabImageView];
[self addScaleAnimationOnView:animationView repeatCount:1];
if(tabBarController.selectedIndex == 2){
[self.selectedViewController cyl_clearBadge];
}
}
//设置数字角标
- (void)showTabBarBadgeWithIndex:(NSInteger)index badge:(NSString *)badge{
if(self.viewControllers.count > index){
[self.viewControllers[index] cyl_showBadgeValue:@"90" animationType:CYLBadgeAnimationTypeNone];
}
}
//缩放动画
- (void)addScaleAnimationOnView:(UIView *)animationView repeatCount:(float)repeatCount {
//需要实现的帧动画,这里根据需求自定义
CAKeyframeAnimation *animation = [CAKeyframeAnimation animation];
animation.keyPath = @"transform.scale";
animation.values = @[@1.0,@1.3,@0.9,@1.15,@0.95,@1.02,@1.0];
animation.duration = 1;
animation.repeatCount = repeatCount;
animation.calculationMode = kCAAnimationCubic;
[animationView.layer addAnimation:animation forKey:nil];
}
+ (UIImage *)imageWithColor:(UIColor *)color size:(CGSize)size {
if (!color || size.width <= 0 || size.height <= 0) return nil;
CGRect rect = CGRectMake(0.0f, 0.0f, size.width + 1, size.height);
UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, color.CGColor);
CGContextFillRect(context, rect);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
#import "AppDelegate.h"
#import "MainTabBarController.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[self.window makeKeyAndVisible];
MainTabBarController *tabBarController = [[MainTabBarController alloc] initTabBar];
[self.window setRootViewController:tabBarController];
//模拟数字角标
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[tabBarController showTabBarBadgeWithIndex:3 badge:@"100"];
});
return YES;
}
@end
网友评论