美文网首页iOS常用
iOS TabBar 轮子

iOS TabBar 轮子

作者: 赵哥窟 | 来源:发表于2021-08-06 14:01 被阅读0次

    今天在GitHub上找了一个TabBar的轮子,Star 6.5k还不错,日常开发已经够用了,设置图片,选中图片,文本颜色,选中文本颜色,数字角标,选中动画,中间凸起按钮都有,日常开发已经够用了。具体可以去GitHub上看文档。
    CYLTabBarController
    自己写的Demo

    Simulator Screen Shot - iPhone 12 Pro - 2021-08-06 at 13.55.35.png

    使用也很简单

    #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
    

    相关文章

      网友评论

        本文标题:iOS TabBar 轮子

        本文链接:https://www.haomeiwen.com/subject/abwbvltx.html