• 首先需要创建一个自定义的tabBar的类,继承于UIview:实现自定义创建tabBar的item按钮,自定义tabBarDelegate,回调block等,具体代码如下:
//  YDWTabBar.h
//  YDWLiveShow
//
//  Created by cptech on 2017/9/6.
//  Copyright © 2017年 CPTECH_ydw. All rights reserved.
//#import <UIKit/UIKit.h>
@class YDWTabBar;// item枚举
typedef NS_ENUM(NSInteger, itemType) {itemTypeLive = 100, // 直播界面itemTypeMe,         // 个人中心itemTypeLanuch = 10 // 启动直播
};// tabBar协议
@protocol YDWTabBarDelegate <NSObject>- (void)tabBar:(YDWTabBar *)tabBar selectItem:(NSInteger)idx;@end// tabBar回调block
typedef void(^tabBarBlock)(YDWTabBar *tabBar, itemType idx);@interface YDWTabBar : UIView@property (nonatomic, weak) id<YDWTabBarDelegate> delegate;
@property (nonatomic, copy) tabBarBlock block;@end//  YDWTabBar.m
//  YDWLiveShow
//
//  Created by cptech on 2017/9/6.
//  Copyright © 2017年 CPTECH_ydw. All rights reserved.
//#import "YDWTabBar.h"@interface YDWTabBar ()@property (nonatomic, strong) UIImageView *tabBarBgView;  // tabBar背景@property (nonatomic, copy) NSArray *itemsArray;          // item图片数组@property (nonatomic, strong) UIButton *selectItem;       // tabBar按钮
@property (nonatomic, strong) UIButton *liveButton;       // 直播按钮@end@implementation YDWTabBar- (void)layoutSubviews {[super layoutSubviews];CGFloat width = self.bounds.size.width/self.itemsArray.count;for (int i = 0; i < [self subviews].count; i++) {UIView *view = [self subviews][i];if ([view isKindOfClass:[UIButton class]]) {view.frame = CGRectMake((view.tag-itemTypeLive)*width, 0, width, self.frame.size.height);}}[self.liveButton sizeToFit];self.liveButton.center = CGPointMake(self.center.x, self.bounds.size.height-50);[self bringSubviewToFront:self.liveButton];
}- (instancetype)initWithFrame:(CGRect)frame {self = [super initWithFrame:frame];if (self) {[self addSubview:self.tabBarBgView];[self addItemButton];[self addSubview:self.liveButton];}return self;
}- (void)addItemButton {for (int i = 0; i < self.itemsArray.count; i++) {UIButton *itemButton = [UIButton buttonWithType:UIButtonTypeCustom];itemButton.tag = itemTypeLive+i;[itemButton setTitle:self.itemsArray[i][@"title"] forState:UIControlStateNormal];[itemButton setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];[itemButton setTitleColor:[UIColor blackColor] forState:UIControlStateSelected];[itemButton.titleLabel setFont:[UIFont systemFontOfSize:11]];[itemButton.titleLabel setTextAlignment:NSTextAlignmentCenter];itemButton.adjustsImageWhenHighlighted = NO; // 禁止图片在高亮状态下改变[itemButton setImage:[UIImage imageNamed:self.itemsArray[i][@"image"]] forState:UIControlStateNormal];[itemButton setImage:[UIImage imageNamed:[self.itemsArray[i][@"image"] stringByAppendingString:@"_p"]] forState:UIControlStateSelected];[itemButton addTarget:self action:@selector(responderToItemSelected:) forControlEvents:UIControlEventTouchUpInside];CGSize imageSize = itemButton.imageView.frame.size;CGSize titleSize = itemButton.titleLabel.frame.size;itemButton.titleEdgeInsets = UIEdgeInsetsMake(0, -imageSize.width, imageSize.height-37, 20);itemButton.imageEdgeInsets = UIEdgeInsetsMake(-titleSize.height-5, 0, 0, -titleSize.width);[self addSubview:itemButton];if (i == 0) {itemButton.selected = YES;self.selectItem = itemButton;}}
}#pragma mark - Events Responder
- (void)responderToItemSelected:(UIButton *)sender {// 响应tabBar协议的方法就回调if ([self.delegate respondsToSelector:@selector(tabBar:selectItem:)]) {[self.delegate tabBar:self selectItem:sender.tag];}//    !self.block?:self.block(self, sender.tag);if (self.block) {self.block(self, sender.tag);}if (sender.tag == itemTypeLanuch) {return;}self.selectItem.selected = NO;sender.selected = YES;self.selectItem = sender;// item添加动画[UIView animateWithDuration:0.2 animations:^{sender.transform = CGAffineTransformMakeScale(1.2, 1.2);} completion:^(BOOL finished) {[UIView animateWithDuration:0.2 animations:^{sender.transform = CGAffineTransformIdentity;}];}];
}#pragma mark - Setter/Getter
- (UIImageView *)tabBarBgView {if (!_tabBarBgView) {_tabBarBgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"global_tab_bg"]];}return _tabBarBgView;
}- (NSArray *)itemsArray {if (!_itemsArray) {_itemsArray = @[@{@"image":@"tab_live",@"title":@"直播"},@{@"image":@"tab_me",  @"title":@"我的"}];}return _itemsArray;
}- (UIButton *)liveButton {if (!_liveButton) {_liveButton = [UIButton buttonWithType:UIButtonTypeCustom];[_liveButton setImage:[UIImage imageNamed:@"tab_launch"] forState:UIControlStateNormal];_liveButton.tag = itemTypeLanuch;[_liveButton addTarget:self action:@selector(responderToItemSelected:) forControlEvents:UIControlEventTouchUpInside];}return _liveButton;
}@end
  • 其次,创一个tabBar的控制器,继承于UITabBarController:主要是装载生成自定义的tabBar,并配置界面视图控制器,代码如下:(当然,这其中,需要创建切换tabBar而展示的不同ViewControlles,我创建了“YDWLiveShowViewController”和“YDWMeCenterViewController”两个视图控制器界面,最好是继承于一个BaseViewController,方便以后修改导航栏和tabBar,还需要创建一个YDWNavViewController,继承于UINavigationController)
//  YDWTabBarViewController.h
//  YDWLiveShow
//
//  Created by cptech on 2017/9/6.
//  Copyright © 2017年 CPTECH_ydw. All rights reserved.
//#import <UIKit/UIKit.h>@interface YDWTabBarViewController : UITabBarController@end//  YDWTabBarViewController.m
//  YDWLiveShow
//
//  Created by cptech on 2017/9/6.
//  Copyright © 2017年 CPTECH_ydw. All rights reserved.
//#import "YDWTabBarViewController.h"
#import "YDWTabBar.h"
#import "YDWNavViewController.h"
#import "YDWLaunchLiveViewController.h"@interface YDWTabBarViewController ()<YDWTabBarDelegate>@property (nonatomic, strong) YDWTabBar *ydwTabBar; //  自定义的tabBar@end@implementation YDWTabBarViewController- (void)viewDidLoad {[super viewDidLoad];[self configViewControllers];[self initilizeFace];
}#pragma mark - Private Methods
- (void)configViewControllers {NSMutableArray *array = [NSMutableArray arrayWithArray:@[@"YDWLiveShowViewController",@"YDWMeCenterViewController"]];for (int i = 0; i < array.count; i++) {UIViewController *vc = [[NSClassFromString(array[i]) alloc] init];YDWNavViewController *nav = [[YDWNavViewController alloc] initWithRootViewController:vc];[array replaceObjectAtIndex:i withObject:nav];}self.viewControllers = array;
}- (void)initilizeFace {[self.tabBar addSubview:self.ydwTabBar];// 去除tabBar的阴影线[[UITabBar appearance] setShadowImage:[UIImage new]];[[UITabBar appearance] setBackgroundImage:[UIImage new]];
}#pragma mark - YDWTabBarDelegate
- (void)tabBar:(YDWTabBar *)tabBar selectItem:(NSInteger)idx {if (idx != itemTypeLanuch) {self.selectedIndex = idx - itemTypeLive;return;}YDWLaunchLiveViewController *launVC = [[YDWLaunchLiveViewController alloc] init];[self presentViewController:launVC animated:YES completion:nil];
}#pragma mark - Setter/Getter
- (YDWTabBar *)ydwTabBar {if (!_ydwTabBar) {_ydwTabBar = [[YDWTabBar alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, 49)];_ydwTabBar.delegate = self;}return _ydwTabBar;
}- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];}@end
  • 最后在AppDelegate中初始化tabBarController即可:
YDWTabBarViewController *vc = [[YDWTabBarViewController alloc] init];
self.window.rootViewController = vc;
  • 最后附上效果图:

iOS之自定义封装tabBar相关推荐

  1. WebClip完成IOS的Wap封装

    title: WebClip完成IOS的Wap封装 tags: WebClip,IOS author: Clown95 背景 当我们使用PC频繁访问某一个网站的时候,大部分人的做法是创建一个书签或者直 ...

  2. 自定义封装ajax,复制即可用

    支持get.post请求 1 <!DOCTYPE html> 2 <html> 3 4 <head> 5 <meta charset="UTF-8& ...

  3. 浅谈android中的自定义封装易用的Dialog

    转载地址:http://blog.csdn.net/u013064109/article/details/51990526 好久没写Android的博客,最近在做一个android的项目,里面用到我们 ...

  4. iOS蓝牙原生封装,助力智能硬件开发

    代码地址如下: http://www.demodashi.com/demo/12010.html 人工智能自1956年提出以来,一直默默无闻,近年来人工智能的发展得到重视逐渐发展起步,智能硬件.智能手 ...

  5. VIVADO 自定义封装ip核(超详细)

    版本:vivado 2018.3 vivado 自定义封装ip核,可以将ip核封装成带AXI总线,也可将ip核封装成不带AXI总线. 本次设计介绍,如何将当前工程封装成ip核(不带AXI总线) 目录 ...

  6. android极光推送声音,【极光推送】iOS APNS 自定义铃声

    IOS APNS自定义推送铃声 是推送给苹果服务器时 将 推送的 key = sound 的value = @"custom.xxx".自定义铃声支持几种固定的格式.本人只以.ca ...

  7. 【测试工具】五、jmeter在GUI与non-GUI模式下结果集自定义封装展示

    原生GUI模式下的效果 可以直观的看出,结果展示无ThreadGroup结构,可读性不好 自定义封装后的效果 GUI 有ThreadGroup结构,目录清晰,可读性好 non-GUI non-GUI模 ...

  8. 前端 json数据转txt文本并下载(前端自定义封装数据并下载文件)

    前端 json数据转txt文本并下载 在工作中,有一次客户要求将图形化的数据转化为txt文件下载 本例中也可前端自定义封装数据并下载文件 其后端传来的数据为json格式,需要前端转化为text数据的形 ...

  9. 易语言多线程多参数自定义封装

    多线程多参数自定义封装 • 1.启动线程_自定义(,,,,,,) • 2..版本 2 • 文件号 = 打开内存文件 () • 写出数据 (文件号, 参数1, 参数2, 参数3, 参数4) • 启动线程 ...

最新文章

  1. SQL语句的解释计划
  2. C#的控件输入法变换
  3. android 关闭软键盘_HTC官方社区明天正式关闭,收入持续下滑或是直接原因
  4. 一篇文章教你如何使用python爬虫
  5. 深圳多管齐下破解“融资难”
  6. 最近很火的MySQL:抛开复杂的架构设计,MySQL优化思想基本都在这
  7. 将txt文件转换成xlsx文件及用matlab读取xlsx
  8. python代码编写规范
  9. pom.xml mvn package expected START_TAG or END_TAG not TEXT
  10. 六石管理学:半弹性工作时间
  11. 企业微信页面在电脑端进行调试的方法
  12. 东八区转为0时区_世界时间与北京时间怎么转换,世界标准(0时差)时间以哪个国家为准?...
  13. 5G知识之5G技术指标、应用场景及相关技术(零星版)
  14. 按下键盘计算机具体发生了点儿啥?
  15. 【即点即改】关于PHP即点即改的一些东西
  16. icc校色文件使用教程_使用ICC特性文件进行校色的方法
  17. 【转】如何从计算视角研究网络传播影响力最大化问题?
  18. vue el-table高度 height自适应
  19. 从个人英雄到万能开发者,程序员3.0时代到来
  20. 离岸公司注册在英国的优势

热门文章

  1. Java程序员必备 : Java反编译神器——“GUI” 资源分享
  2. H5开发 连接蓝牙打印机 打印标签(斑马ZR628)
  3. oracle 表空间-用户-授权-表创建
  4. 51. N-Queens
  5. Maven学习小结(七 生命周期[转])
  6. 大规模markpoint特效
  7. eclipse @ 注释为何一写就报错
  8. inline-block的兼容性问题
  9. 小知识汇总----不断更新中...
  10. 【转载自codeproject】Another Look At IDisposable