在我们的项目中经常会自己自定义tabBar因为苹果自带的真的太丑了!也不满足我们的项目需求。

好 开始行动吧!

先上图看下我们最终实现的效果:

继承UItabBar自定义一个自己的tabBar

  1. .h
    #import <UIKit/UIKit.h>

    @class HJTTabBar;
    @protocol ZTTabBarDelegate <UITabBarDelegate>

    @optional

    - (void)tabBarDidClickPlusButton:(HJTTabBar *)tabBar;

    @end

    @interface HJTTabBar : UITabBar

    @property (nonatomic, weak) id<ZTTabBarDelegate> myDelegate;

    @end

    复制代码
  1. .m
    #import "HJTTabBar.h"
    #import "UIBarButtonItem+Extension.h"
    #import "UIView+Extension.h"
    @interface HJTTabBar ()

    @property (nonatomic, weak) UIButton *plusBtn;

    @end

    @implementation HJTTabBar

    - (instancetype)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self) {
            UIButton *plusBtn = [[UIButton alloc] init];
            [plusBtn setBackgroundImage:[UIImage imageNamed:@"tabbar_compose_button"] forState:UIControlStateNormal];
            [plusBtn setBackgroundImage:[UIImage imageNamed:@"tabbar_compose_button_highlighted"] forState:UIControlStateHighlighted];
            [plusBtn setImage:[UIImage imageNamed:@"tabbar_compose_icon_add"] forState:UIControlStateNormal];
            [plusBtn setImage:[UIImage imageNamed:@"tabbar_compose_icon_add_highlighted"] forState:UIControlStateHighlighted];

            plusBtn.size = plusBtn.currentBackgroundImage.size;
            [plusBtn addTarget:self action:@selector(plusBtnClick) forControlEvents:UIControlEventTouchUpInside];
            [self addSubview:plusBtn];
            self.plusBtn = plusBtn;
        }
        return self;
    }

    /**
     *  加号按钮点击
     */
    - (void)plusBtnClick
    {
        // 通知代理
        if ([self.delegate respondsToSelector:@selector(tabBarDidClickPlusButton:)]) {
            [self.myDelegate tabBarDidClickPlusButton:self];
        }
    }

    /**
     *  想要重新排布系统控件subview的布局,推荐重写layoutSubviews,在调用父类布局后重新排布。
     */
    - (void)layoutSubviews
    {
        [super layoutSubviews];
        
        // 1.设置加号按钮的位置
        self.plusBtn.centerX = self.width*0.5;
        self.plusBtn.centerY = self.height*0.5;
        
        // 2.设置其他tabbarButton的frame
        CGFloat tabBarButtonW = self.width / 5;
        CGFloat tabBarButtonIndex = 0;
        for (UIView *child in self.subviews) {
    //UITabBarItem  UITabBarButton
            Class class = NSClassFromString(@"UITabBarItem  ");
            if ([child isKindOfClass:class]) {
                // 设置x
                child.= tabBarButtonIndex * tabBarButtonW;
                // 设置宽度
                child.width = tabBarButtonW;
                // 增加索引
                tabBarButtonIndex++;
                if (tabBarButtonIndex == 2) {
                    tabBarButtonIndex++;
                }
            }
        }
    }

    @end

    复制代码

下面是Category:

  1. UIView+Extension.h中:
    #import <UIKit/UIKit.h>

    @interface UIView (Extension)

    @property (nonatomic, assign) CGFloat x;
    @property (nonatomic, assign) CGFloat y;
    @property (nonatomic, assign) CGFloat centerX;
    @property (nonatomic, assign) CGFloat centerY;
    @property (nonatomic, assign) CGFloat width;
    @property (nonatomic, assign) CGFloat height;
    @property (nonatomic, assign) CGSize size;
    @property (nonatomic, assign) CGPoint origin;

    @end
    复制代码
  1. UIView+Extension.m中:
    #import "UIView+Extension.h"

    @implementation UIView (Extension)

    - (void)setX:(CGFloat)x
    {
        CGRect frame = self.frame;
        frame.origin.= x;
        self.frame = frame;
    }

    - (void)setY:(CGFloat)y
    {
        CGRect frame = self.frame;
        frame.origin.= y;
        self.frame = frame;
    }

    - (CGFloat)x
    {
        return self.frame.origin.x;
    }

    - (CGFloat)y
    {
        return self.frame.origin.y;
    }

    - (void)setCenterX:(CGFloat)centerX
    {
        CGPoint center = self.center;
        center.= centerX;
        self.center = center;
    }

    - (CGFloat)centerX
    {
        return self.center.x;
    }

    - (void)setCenterY:(CGFloat)centerY
    {
        CGPoint center = self.center;
        center.= centerY;
        self.center = center;
    }

    - (CGFloat)centerY
    {
        return self.center.y;
    }

    - (void)setWidth:(CGFloat)width
    {
        CGRect frame = self.frame;
        frame.size.width = width;
        self.frame = frame;
    }

    - (void)setHeight:(CGFloat)height
    {
        CGRect frame = self.frame;
        frame.size.height = height;
        self.frame = frame;
    }

    - (CGFloat)height
    {
        return self.frame.size.height;
    }

    - (CGFloat)width
    {
        return self.frame.size.width;
    }

    - (void)setSize:(CGSize)size
    {
        CGRect frame = self.frame;
        frame.size = size;
        self.frame = frame;
    }

    - (CGSize)size
    {
        return self.frame.size;
    }

    - (void)setOrigin:(CGPoint)origin
    {
        CGRect frame = self.frame;
        frame.origin = origin;
        self.frame = frame;
    }

    - (CGPoint)origin
    {
        return self.frame.origin;
    }

    @end
    复制代码
  1. UIBarButtonItem+Extension.h中:

    #import <UIKit/UIKit.h>

    @interface UIBarButtonItem (Extension)

    + (UIBarButtonItem *)itemWithTargat:(id)target action:(SEL)action image:(NSString *)image highImage:(NSString *)highImage;

    @end
    复制代码
  1. UIBarButtonItem+Extension.m中:

    #import "UIBarButtonItem+Extension.h"
    #import "UIView+Extension.h"
    @implementation UIBarButtonItem (Extension)

    /**
     *  创建一个item
     *
     *  @param target    点击item后调用哪个对象的方法
     *  @param action    点击item后调用target的哪个方法
     *  @param image     图片
     *  @param highImage 高亮的图片
     *
     *  @return 创建完的item
     */
    + (UIBarButtonItem *)itemWithTargat:(id)target action:(SEL)action image:(NSString *)image highImage:(NSString *)highImage
    {
        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
        // 设置图片
        [btn setBackgroundImage:[UIImage imageNamed:image] forState:UIControlStateNormal];
        [btn setBackgroundImage:[UIImage imageNamed:highImage] forState:UIControlStateHighlighted];
        // 设置尺寸
        btn.size = btn.currentBackgroundImage.size;
        [btn addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];
        
        return [[UIBarButtonItem alloc] initWithCustomView:btn];
    }

    @end

    复制代码

接下来我们就该在需要的地方使用自定义的tabBar了

  • 我是在UITabBarController中使用自定义的tabBar。
  1. 导入#import "HJTTabBar.h"并遵循 HJTTabBarDelegate协议。
    复制代码
  1. 在- (void)viewDidLoad 中实现下面代码:

    - (void)viewDidLoad {
        [super viewDidLoad];
        
        // 添加子控制器
        [self addChildVc:[[FirstPageViewController alloc] init] title:@"首页" image:@"tabbar_home" selectedImage:@"tabbar_home_selected"];
        [self addChildVc:[[CommunityViewController alloc] init] title:@"社区" image:@"tabbar_message_center" selectedImage:@"tabbar_message_center_selected"];
        [self addChildVc:[[MessageViewController alloc] init] title:@"消息" image:@"tabbar_discover" selectedImage:@"tabbar_discover_selected"];
        [self addChildVc:[[ConsultViewController alloc] init] title:@"咨询" image:@"tabbar_profile" selectedImage:@"tabbar_profile_selected"];
        
        HJTTabBar *tabBar = [[HJTTabBar alloc] init];
        
        //取消tabBar的透明效果
        tabBar.translucent = NO;
        tabBar.myDelegate = self;
        // KVC:如果要修系统的某些属性,但被设为readOnly,就是用KVC,即setValue:forKey:。
        [self setValue:tabBar forKey:@"tabBar"];
          
    }
    复制代码

  1. 实现下面方法:

    - (void)addChildVc:(UIViewController *)childVc title:(NSString *)title image:(NSString *)image selectedImage:(NSString *)selectedImage
    {
        // 设置子控制器的文字(可以设置tabBar和navigationBar的文字)
        childVc.title = title;
        
        // 设置子控制器的tabBarItem图片
        childVc.tabBarItem.image = [UIImage imageNamed:image];
        // 禁用图片渲染
        childVc.tabBarItem.selectedImage = [[UIImage imageNamed:selectedImage] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
        
        // 设置文字的样式
        [childVc.tabBarItem setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor blackColor]} forState:UIControlStateNormal];
        [childVc.tabBarItem setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor redColor]} forState:UIControlStateSelected];
        //    childVc.view.backgroundColor = RandomColor; // 这句代码会自动加载主页,消息,发现,我四个控制器的view,但是view要在我们用的时候去提前加载
        
        // 为子控制器包装导航控制器
        UINavigationController *navigationVc = [[UINavigationController alloc] initWithRootViewController:childVc];
        // 添加子控制器
        [self addChildViewController:navigationVc];
    }
    复制代码

  1. #pragma HJTTabBarDelegate
    /**
     *  加号按钮点击
     */
    - (void)tabBarDidClickPlusButton:(HJTTabBar *)tabBar
    {
        NSLog(@"+++");
    }
    复制代码

好了 完事!

iOS自定义tabBar的更多相关文章

  1. iOS 自定义Tabbar实现push动画隐藏效果

    http://wonderffee.github.io/blog/2013/08/07/hide-custom-tab-bar-with-animation-when-push/ 在之前的一篇文章(链 ...

  2. iOS自定义TabBar使用popToRootViewControllerAnimated返回后tabbar重叠

    解决方法 所以方法就是:遵循UINavigationController的代理,用代理方法解决该Bug,代码如下: 实现代理方法: { // 删除系统自带的tabBarButton for (UIVi ...

  3. iOS 隐藏自定义tabbar

    iOS  隐藏自定义tabbar -(void)viewWillAppear:(BOOL)animated { NSArray *array=self.tabBarController.view.su ...

  4. IOS第二天-新浪微博 - 添加搜索框,弹出下拉菜单 ,代理的使用 ,HWTabBar.h(自定义TabBar)

    ********HWDiscoverViewController.m(发现) - (void)viewDidLoad { [super viewDidLoad]; // 创建搜索框对象 HWSearc ...

  5. iOS开发之功能模块--关于自定义TabBar条

    只上项目中用到的代码: 1.实现重写TabBar的TabBarItem,然后在中间额外加一个按钮. #import <UIKit/UIKit.h> @interface BikeTabBa ...

  6. iOS开发项目之四 [ 调整自定义tabbar的位置与加号按钮的位置]

    自定义tabbar与按钮的添加 01 - 把系统的tabbar用我们自己的覆盖 LHQTabBar *lhqTabBar = [[LHQTabBar alloc]init]; [self setVal ...

  7. [iOS微博项目 - 1.6] - 自定义TabBar

    A.自定义TabBar 1.需求 控制TabBar内的item的文本颜色(普通状态.被选中状态要和图标一致).背景(普通状态.被选中状态均为透明) 重新设置TabBar内的item位置,为下一步在Ta ...

  8. iOS 轻松实现自定义TabBar

    自定义TabBar的案例网上不少,昨天受到开发小伙伴的影响,尝试了一下非大神的取巧思路:Demo 1.创建RootViewController,后面创建几个继承的VC,将这几个VC添加到TabBarC ...

  9. iOS框架搭建(MVC,自定义TabBar)--微博搭建为例

    项目搭建 1.新建一个微博的项目,去掉屏幕旋转 2.设置屏幕方向-->只有竖向 3.使用代码构建UI,不使用storyboard 4.配置图标AppIcon和LaunchImage 将微博资料的 ...

随机推荐

  1. 【PHP】PHP运算符

    一.      概论: a)    在数学中的运算符和PHP当中的运算符可能有一些小小的区别,但是区别 不打,都是用来做计算的:唯一的区别是,PHP当中的运算符分类比较多 二.      PHP当中运 ...

  2. Vulnhub JIS-CTF-VulnUpload靶机渗透

    配置问题解决 参考我的这篇文章https://www.cnblogs.com/A1oe/p/12571032.html更改网卡配置文件进行解决. 信息搜集 找到靶机 nmap -sP 192.168. ...

  3. Ubuntu 修改$PS1 自定义命令提示符

    文章更新于:2020-03-25 文章目录 一.自定义命令提示符 1.可修改的是那部分? 2.修改 $PS1 变量 3.$PS1 变量格式 4.如何修改背景颜色 5.修改字体 二.Enjoy! 一.自 ...

  4. 【网络编程01】socket的基础知识-简单网络通信程序

    1.什么是socket socket(套接字),简单来说是IP地址与端口(port)的组合,可以与远程主机的应用程序进行通信.通过IP地址可以确定一台主机,而通过端口则可以确定某一个应用程序.IP+端 ...

  5. json.dumps() 和 json.loads()

    转载: https://blog.csdn.net/qinglingls/article/details/96476368

  6. Linux c++ vim环境搭建系列(2)——Ubuntu18.04.4编译安装llvm clang

    2. 源码编译安装llvm clang 参考网址: https://llvhttps

  7. 360众测考试,weblogic题(CVE-2018-2894)文件上传漏洞

    0x01 漏洞简介 Weblogic管理端未授权的两个页面存在任意上传jsp文件漏洞,进而获取服务器权限. Oracle 7月更新中,修复了Weblogic Web Service Test Page ...

  8. 概率专题_概率/ 数学_基础题_ABEI

    上周三讲了概率和概率dp.如果没有涉及其他综合算法,概率这种题主要是思维,先把这部分的东西写完 给个题目链接:https://vjudge.net/contest/365300#problem Hea ...

  9. python 自动打包,发送邮件(包括附件)至多个收件人(qq邮箱,163邮箱)

    -----------------------------打包部分---------------------------------- import zipfile def zipDir(dirpat ...

  10. 前端架构演进及主流UI

    @ 目录 前端三要素 JavaScript 框架 NodeJs 常用UI框架 前后端分离的演进 MVVM模式 总结 前端演进到现在,各种技术框架已经层出不穷了,作为一名开发少不了要干一些前端的活儿,那 ...