自定义TabBar

| 需要实现的效果(参考 百思不得姐)
中间的UITabBarButton 没有对应的UIViewContrller. 所以需要重新布局.

实现的效果.png

自定义了一个RootViewController(YYRootTabBarController 其继承自UITabBarController )

#import "AppDelegate.h"
#import "YYRootTabBarController.h"
@interface AppDelegate ()

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
    self.window.rootViewController = [[YYRootTabBarController alloc]init];
    [self.window makeKeyAndVisible];
    return YES;
}
...

YYRootTabBarController.h 文件

#import 

@interface YYRootTabBarController : UITabBarController

@end

YYRootTabBarController.m 文件

#import "YYRootTabBarController.h"
#import "YYFirstViewController.h"
#import "YYSecondViewController.h"
#import "YYThirdViewController.h"
#import "YYFourViewController.h"
#import "YYTabBar.h"
@interface YYRootTabBarController ()

@end

@implementation YYRootTabBarController

- (void)viewDidLoad {
    [super viewDidLoad];
    // 设置应用程序中所有的UITabBarItem 的属性
    UITabBarItem *item = [UITabBarItem appearance]; // 认为是一个皮肤
    // 属性字典
    NSDictionary *normalDic = @{NSFontAttributeName:[UIFont systemFontOfSize:12],
                                 NSForegroundColorAttributeName:[UIColor grayColor]
                                 };
    NSDictionary *selectedDic = @{NSForegroundColorAttributeName:[UIColor darkGrayColor]
                                  };
    
    [item setTitleTextAttributes:normalDic forState:UIControlStateNormal];
    [item setTitleTextAttributes:selectedDic forState:UIControlStateSelected];
    
    YYTabBar *tabBar = [[YYTabBar alloc]init];
    [self setValue:tabBar forKey:@"tabBar"];
  

    //初始化我们的自控制器
    [self setUpChildVC];
    
}

- (void)setUpChildVC{
    // 第一个
    [self setUpChildViewController:[[YYFirstViewController alloc] init] title:@"首页" normalImageName:@"" selectedImageName:@""];
    // 第二个
    [self setUpChildViewController:[[YYSecondViewController alloc] init] title:@"发现" normalImageName:@"" selectedImageName:@""];
    // 第三个
    [self setUpChildViewController:[[YYThirdViewController alloc] init] title:@"搜索" normalImageName:@"" selectedImageName:@""];
    // 第四个
    [self setUpChildViewController:[[YYFourViewController alloc] init] title:@"我的" normalImageName:@"" selectedImageName:@""];

}

// 添加自控制器 如果需要 UINavigationController 可以在这里添加
- (void)setUpChildViewController:(UIViewController *)vc title:(NSString *)title normalImageName:(NSString *)normalImageName selectedImageName:(NSString *)selectedImageName{
    UINavigationController *NAV = [[UINavigationController alloc]initWithRootViewController:vc
                                   ];
    vc.tabBarItem.title = title;
    vc.tabBarItem.image = [UIImage imageNamed:normalImageName]; // 防止图片使用系统默认颜色 [[UIImage imageNamed:@""] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    vc.tabBarItem.selectedImage = [UIImage imageNamed:selectedImageName]; // 防止图片使用系统默认颜色 [[UIImage imageNamed:@""] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    [self addChildViewController:NAV];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}
@end

YYTabBar.h 文件

#import 

@interface YYTabBar : UITabBar

@end

YYTabBar.m 文件

#import "YYTabBar.h"

@interface YYTabBar()
@property (nonatomic, weak) UIButton *plushBtn; // 中间红的的加号
@end

@implementation YYTabBar

- (instancetype)initWithFrame:(CGRect)frame{
    if (self = [super initWithFrame:frame]) {
        // 设置背景图片
        self.backgroundImage = [UIImage imageNamed:@""];
        // 初始化操作
        UIButton *plushBtn = [[UIButton alloc]init];
        [plushBtn setBackgroundImage:[UIImage imageNamed:@""] forState:UIControlStateNormal];
        [plushBtn setBackgroundImage:[UIImage imageNamed:@""] forState:UIControlStateHighlighted];
        self.plushBtn = plushBtn;
        [self addSubview:plushBtn];
    }
    return self;
}

//布局子空间

- (void)layoutSubviews{
    [super layoutSubviews];
    self.plushBtn.bounds = CGRectMake(0, 0, self.plushBtn.currentBackgroundImage.size.width, self.plushBtn.currentBackgroundImage.size.height); // 以背景图片的大小设置按钮的大小
    self.plushBtn.center = CGPointMake(self.frame.size.width * 0.5, self.frame.size.height * 0.5); // 应该等价于 self.plushBtn.center = self.center;
    // 布局UItabBarButton
    int index = 0;
    CGFloat W = self.frame.size.width * 0.2; // 一共 5 个 评分, 所有每个占 0.2
    CGFloat H = self.frame.size.height;
    CGFloat Y = 0;
    for (UIView * view in self.subviews) {
        Class class = NSClassFromString(@"UITabBarButton");
        if ([view isKindOfClass:class]) {
            CGFloat X = W * ((index == 2) ? ++index : index); // 跳过当中的那一个
            view.frame = CGRectMake(X, Y, W, H);
            index ++;
        }
    }
}
@end

补充: 1.其中图片的名称没有补全
2.如果有什么问题, 可以私信

你可能感兴趣的:(自定义TabBar)