今天在做项目的时候,突然有一个模块需要自定义TabBar条.

在平常很多做项目的时候,都没有去自定义过,大部分都是使用系统自带的.今天整理一个自定义TabBar条的步骤.

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


首先需要继承UItabBar自定义一个自己的tabBar
.h
#import <UIKit/UIKit.h>@class THTabBar; @protocol THTabBarDelegate <UITabBarDelegate> @optional - (void)tabBarDidClickPlusButton:(THTabBar *)tabBar; @end @interface THTabBar : UITabBar @property (nonatomic, weak) id<THTabBarDelegate> myDelegate; @end
.m
#import "THTabBar.h"
#import "UIBarButtonItem+Extension.h"
#import "UIView+Extension.h" @interface THTabBar () @property (nonatomic, weak) UIButton *plusBtn; @end @implementation THTabBar - (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) { Class class = NSClassFromString(@"UITabBarButton"); if ([child isKindOfClass:class]) { // 设置x child.x = tabBarButtonIndex * tabBarButtonW; // 设置宽度 child.width = tabBarButtonW; // 增加索引 tabBarButtonIndex++; if (tabBarButtonIndex == 2) { tabBarButtonIndex++; } } } } @end

下面是Category:

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
UIView+Extension.m中:
#import "UIView+Extension.h"@implementation UIView (Extension) - (void)setX:(CGFloat)x { CGRect frame = self.frame; frame.origin.x = x; self.frame = frame; } - (void)setY:(CGFloat)y { CGRect frame = self.frame; frame.origin.y = 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.x = centerX; self.center = center; } - (CGFloat)centerX { return self.center.x; } - (void)setCenterY:(CGFloat)centerY { CGPoint center = self.center; center.y = 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
UIBarButtonItem+Extension.h中:#import <UIKit/UIKit.h>@interface UIBarButtonItem (Extension) + (UIBarButtonItem *)itemWithTargat:(id)target action:(SEL)action image:(NSString *)image highImage:(NSString *)highImage; @end
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。

导入#import "THTabBar.h"并遵循 THTabBarDelegate协议。
在- (void)viewDidLoad 中实现下面代码:- (void)viewDidLoad {[super viewDidLoad];// 添加子控制器[self addChildVc:[[FirstPageViewController alloc] init] title:@"首页" image:@"tabbar_home" selectedImage:@"tabbar_home_selected"]; [self addChildVc:[[ConsultViewController alloc] init] title:@"我的" image:@"tabbar_profile" selectedImage:@"tabbar_profile_selected"]; THTabBar *tabBar = [[THTabBar alloc] init]; //取消tabBar的透明效果 tabBar.translucent = NO; tabBar.myDelegate = self; // KVC:如果要修系统的某些属性,但被设为readOnly,就是用KVC,即setValue:forKey:。 [self setValue:tabBar forKey:@"tabBar"]; }
实现下面方法:- (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]; }
#pragma THTabBarDelegate
/***  加号按钮点击*/
- (void)tabBarDidClickPlusButton:(THTabBar *)tabBar { NSLog(@"+++"); }

以上这些代码就是我所整理的关于自定义TabBar条的大致过程.

转载于:https://www.cnblogs.com/THth/p/6388106.html

IOS开发-关于自定义TabBar条相关推荐

  1. iOS开发之自定义View的一些坑

    我们做几个简单的例子哈 自定义一个View View的m文件中有代码如下: @implementation BMView- (instancetype)init {if (self = [super ...

  2. IOS开发之自定义UIActionSheet

    IOS开发中,经常会用到UIActionSheet,但是,默认的只能添加按钮.如果能自定义的话,岂不是更好?上网搜了一下,都是只有那一种代码,通过设置几个按钮来增加UIActionSheet的高度,不 ...

  3. iOS开发 - 使用自定义字体

    上次有个同事问我,XXapp的字体怎么那么萌啊?我也想要搞个萌哒哒的字体!于是,就有了今天这篇blog. 首先,我们在iOS开发中,苹果给我们提供了许多的字体,当然这里我就不列举啦,都是些英文,小汤表 ...

  4. iOS开发之自定义View

    iOS sdk中的view是UIView,我们可以很方便的自定义一个View. 创建一个 Window-based Application程序,在其中添加一个Hypnosister的类,这个类选择继承 ...

  5. Navisworks API 简单二次开发 (自定义工具条)

    在Navisworks软件运行的时候界面右侧有个工具条.比较方便.但是在二次开发的时候我不知道在Api那里调用.如果有网友知道请告诉我.谢谢. 我用就自己设置一个工具.界面比较丑!没有美工. 代码: ...

  6. iOS开发之自定义键盘(数字,字母类型等随意切换)

    项目开发很多时候用系统给的键盘不是很满足自身实际需求,那就自定义一个吧: 方法其实很简单,重新定义一个view,继承UItextfield,把UI设计好的需求键盘加入新的otherKeyboardVi ...

  7. (0027)iOS 开发之调整导航条上BarButtonItem与屏幕边界的间距

    我们发现,在设置navigationItem的leftBarButtonItem或rightBarButtonItem时,用CustomView初始化UIBarButtonItem,不论怎么设置Cus ...

  8. IOS开发之自定义Button(集成三种回调模式)

    前面在做东西的时候都用到了storyboard,在今天的代码中就纯手写代码自己用封装个Button.这个Button继承于UIView类,在封装的时候用上啦OC中的三种回调模式:目标动作回调,委托回调 ...

  9. iOS开发--AVFoundation自定义相机

    首先导入一个头文件 #import <AVFoundation/AVFoundation.h> 由于后面我们需要将拍摄好的照片写入系统相册中,所以我们在这里还需要导入一个相册需要的头文件 ...

最新文章

  1. 重新启动正在运行的linux,下面哪个命令行可用来马上重新启动正在运行的Linux系统()。A.restart--delay=0B.reboot-wC.halt-p...
  2. GNU parted的指令說明[转]
  3. MIT:这双AI袜子,暴露了你的行动丨Nature子刊
  4. 图像二值化之最大类间方差法(大津法,OTSU)
  5. 数据科学产业中哪些架构最热门?本文为你盘点了 5 款!
  6. 工厂电子产品工艺文件_建智能工厂,人机如何达到最佳组合?
  7. OpenJudge NOI 1.7 28:单词倒排
  8. group by两个条件
  9. pdf覆盖图片 Java_Java 添加、替换、删除PDF中的图片的示例代码
  10. 从远程服务器拷贝文件命令,远程拷贝文件命令Scp的使用
  11. 汇编 第二章 寄存器
  12. python获得字符串长度的函数_python字符串函数
  13. 计算机网络实验——使用网络协议分析仪Wireshark
  14. 从不跑步到无间断跑步1年感受
  15. 英文论文评审意见_sci英文论文审稿意见怎么写(7)
  16. 计算机控制面板设置命令,电脑的控制面板在哪打开,分享四种打开方法
  17. python文件批量改名
  18. 22_ue4进阶末日生存游戏开发[EQS]
  19. C语言小游戏--贪食蛇
  20. 用Python可以解决的数学问题,探究代数、统计、几何、概率等

热门文章

  1. django进阶03静态文件和模板
  2. 山西民生云养老认证人脸识别_民生山西APP公众号手机认证
  3. matlab百分制到5分制的转换,绩点换算百分制(绩点5分制百分对照表)
  4. python运行时间只算快的吗_Python 疑难问题:[] 与 list() 哪个快?为什么快?快多少呢?...
  5. 并注册烧写钩子 获取启动介质类型_PyTorch中对张量登记注册反向传播的钩子函数,并展示调用顺序...
  6. 启动rrt什么意思_面试官:你来说一下springboot启动时的一个自动装配过程吧!...
  7. mac安装gnu make_Linux Make的使用以及命令安装详解
  8. TraPHic: Trajectory Prediction in Dense and Heterogeneous Traffic Using Weighted Interactions
  9. Scrapy爬虫框架入门
  10. 模型压缩:Deep Compression