还在用系统自带的?那你那就OUT了!
相信如今的APP10个里面有九个是有Tabbar的,可是非常多人甚是非常多公司都在用系统自带的tabbar。当然这也不是不能够,并且项目中就那几行代码。效果又一样。
可是,别忘了另一个可是。然并卵。这样并不符合苹果的设计理念。
好了 老规矩话不多说,先上图:
这个是高仿美团的tabbar。
接下来上主要代码吧:
自己定义tabbar.h
@class JFTabBar;
//给每一个按钮定义协议 与 方法
@protocol tabbarDelegate <NSObject>
@optional
-(void)tabBar:(JFTabBar * )tabBar didselectedButtonFrom:(int)from to:(int)to;
@end
@interface JFTabBar : UIView
@property (weak ,nonatomic)JFTabBarButton *selectedButton;
/**
* 给自己定义的tabbar加入按钮
*/
-(void)addTabBarButtonWithItem:(UITabBarItem *)itme;
@property(nonatomic , weak) id <tabbarDelegate> delegate;
自己定义tabbar.m
#import "JFTabBar.h"
#import "JFTabBarButton.h"
@implementation JFTabBar
-(void)addTabBarButtonWithItem:(UITabBarItem *)itme{
//1.创建按钮
JFTabBarButton *button = [[JFTabBarButton alloc]init];
[self addSubview:button];
/*
[button setTitle:itme.title forState:UIControlStateNormal];
[button setImage:itme.image forState:UIControlStateNormal];
[button setImage:itme.selectedImage forState:UIControlStateSelected];
[button setBackgroundImage:[UIImage imageWithName:@"tabbar_slider"] forState:UIControlStateSelected];
*/
//设置数据
button.item = itme;
//监听点击button
[button addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchDown];
//默认选中
if (self.subviews.count == 1) {
[self buttonClick:button];
}
}
/**
* button监听事件
*
*/
-(void)buttonClick:(JFTabBarButton*)button{
if ([self.delegate respondsToSelector:@selector(tabBar:didselectedButtonFrom:to:)]
)
{
[self.delegate tabBar:self didselectedButtonFrom:(int)self.selectedButton.tag to:(int)button.tag];
}
self.selectedButton.selected = NO;
button.selected = YES;
self.selectedButton = button;
}
-(void)layoutSubviews{
[super layoutSubviews];
CGFloat buttonW = self.frame.size.width/ self.subviews.count ;
CGFloat buttonH = self.frame.size.height;
CGFloat buttonY = 0 ;
for ( int index = 0; index < self.subviews.count; index++) {
//1.取出按钮
JFTabBarButton *button = self.subviews[index];
//2. 设置按钮的frame
CGFloat buttonX = index * buttonW;
button.frame = CGRectMake(buttonX, buttonY, buttonW, buttonH) ;
//绑定tag;
button.tag = index;
}
}
继承tabbatControler.m
#import "JFTabBarViewController.h"
#import "JFTabBar.h"
#import "ViewController.h"
#import "JFMineViewController.h"
#import "JFMoreViewController.h"
#import "JFMerchantViewController.h"
#import "JFVisitViewController.h"
@interface JFTabBarViewController ()<tabbarDelegate>
@property(nonatomic ,strong)JFTabBar *costomTabBar;
@end
@implementation JFTabBarViewController
- (void)viewDidLoad {
[super viewDidLoad];
//初始化tabbar
[self setUpTabBar];
//加入子控制器
[self setUpAllChildViewController];
}
//取出系统自带的tabbar并把里面的按钮删除掉
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:YES];
for ( UIView * child in self.tabBar.subviews) {
if ([child isKindOfClass:[UIControl class]]) {
[child removeFromSuperview];
}
}
}
-(void)setUpTabBar{
JFTabBar *customTabBar = [[JFTabBar alloc]init];
customTabBar.delegate = self;
// customTabBar.backgroundColor = [UIColor redColor];
customTabBar.frame = self.tabBar.bounds;
self.costomTabBar = customTabBar;
[self.tabBar addSubview:customTabBar];
}
-(void)tabBar:(JFTabBar *)tabBar didselectedButtonFrom:(int)from to:(int)to{
NSLog(@"%d, %d", from, to);
self.selectedIndex = to;
NSLog(@"%lu", (unsigned long)self.selectedIndex);
}
-(void)setUpAllChildViewController{
ViewController *homeVC = [[ViewController alloc]init];
[self setupChildViewController:homeVC title:@"首页" imageName:@"icon_tabbar_homepage" seleceImageName:@"icon_tabbar_homepage_selected"];
JFVisitViewController *visitVC = [[JFVisitViewController alloc]init];
[self setupChildViewController:visitVC title:@"上门" imageName:@"icon_tabbar_onsite" seleceImageName:@"icon_tabbar_onsite_selected"];
JFMerchantViewController *merchantVC = [[JFMerchantViewController alloc]init];
[self setupChildViewController:merchantVC title:@"商家" imageName:@"icon_tabbar_merchant_normal" seleceImageName:@"icon_tabbar_merchant_normal_selected"];
JFMineViewController *mineVC = [[JFMineViewController alloc]init];
[self setupChildViewController:mineVC title:@"我的" imageName:@"icon_tabbar_mine" seleceImageName:@"icon_tabbar_mine_selected"];
JFMoreViewController *moreVC = [[JFMoreViewController alloc]init];
[self setupChildViewController:moreVC title:@"很多其它" imageName:@"icon_tabbar_misc" seleceImageName:@"icon_tabbar_misc_selected"];
}
-(void)setupChildViewController:(UIViewController*)controller title:(NSString *)title imageName:(NSString *)imageName seleceImageName:(NSString *)selectImageName{
controller.title = title;
controller.tabBarItem.image = [UIImage imageNamed:imageName];
controller.tabBarItem.selectedImage = [UIImage imageNamed:selectImageName];
//包装导航控制器
UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:controller];
[self addChildViewController:nav];
[self.costomTabBar addTabBarButtonWithItem:controller.tabBarItem];
}
以上是部分主要代码
有问题能够提出来。我们一起探讨。
祝好。
还在用系统自带的?那你那就OUT了!的更多相关文章
- Notepad2替代系统自带的记事本
事情是这样的,平时我经常把一些文字复制到记事本中编辑好了再复制到目标位置,可以在系统自带的记事本中替换删除一些内容,记事本小巧,占用很少的资源,我很喜欢:但今天复制的内容中有很多数字和一些我不想要的内 ...
- Android去掉listView,gridView等系统自带阴影
当我们使用listView的时候,拉到顶,或是拉到底部的时候,我们会发现有系统自带的阴影效果出现,不同手机出现的颜色可能还会不一样. 在以前我始终都有注意到此问题,一直以为是系统自带的,不能去掉.也没 ...
- 利用win7系统自带的dos命令把笔记本无线网卡当无线路由器(无线AP发射器)
利用win7系统自带的dos命令把笔记本无线网卡当无线路由器(无线AP发射器). 1.打开win7开始菜单,找到命令提示符选项,以管理员身份运行cmd.2.在命令行上输入:netsh wlan set ...
- Android manifest之系统自带的permission
Android manifest之系统自带的permission 本文描述Android系统自带的permission.点击查看:“关于permission的原始定义和说明”.点击查看:“Androi ...
- 关于自定义tabBar时修改系统自带tabBarItem属性造成的按钮顺序错乱的问题相关探究
关于自定义tabBar时修改系统自带tabBarItem属性造成的按钮顺序错乱的问题相关探究 测试代码:http://git.oschina.net/Xiyue/TabBarItem_TEST 简 ...
- 系统自带的日志管理工具-rsyslogd
系统自带的日志管理工具-rsyslogd 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.日志管理简介 1.什么是日志 系统日志是记录系统中硬件.软件和系统问题的信息,同时还可以 ...
- Win10系统自带输入法的人机交互设计
过了寒假回校以后,我的电脑重装了系统,为了提升系统运行的速度,自己装了一个内存条同时对硬盘进行了重新的分区,对电脑内的文件也进行了重新的整理,电脑的运行速度提高了很多.老多同学都说win10系统好用, ...
- 笨重的mfc还在基于系统控件,熟练的mfc工程师还比不过学习Qt一个月的学生开发效率高(比较精彩,韦易笑)
作者:韦易笑链接:https://www.zhihu.com/question/29636221/answer/45102191来源:知乎著作权归作者所有,转载请联系作者获得授权. 更新:擦,本来只有 ...
- 本文介绍使用windows系统自带的远程桌面mstsc连接Centos 7.x远程桌面的基本方法。
本文介绍使用windows系统自带的远程桌面mstsc连接Centos 7.x远程桌面的基本方法. 一.前言 我希望用windows远程访问centos图形界面.xmanager连接centos远程桌 ...
随机推荐
- Codeforces 940F Machine Learning (带修改莫队)
题目链接 Codeforces Round #466 (Div. 2) Problem F 题意 给定一列数和若干个询问,每一次询问要求集合$\left\{c_{0}, c_{1}, c_{2}, ...
- 树的直径【bzoj3363】 [Usaco2004 Feb]Cow Marathon 奶牛马拉松
Description 最近美国过度肥胖非常普遍,农夫约翰为了让他的奶牛多做运动,举办了奶牛马拉松.马拉松路线要尽量长,所以,告诉你农场的地图(该地图的描述与上题一致),请帮助约翰寻找两个最远农场间的 ...
- extjs grid合并单元格
http://blog.csdn.net/kunoy/article/details/7829395 /** * Kunoy * 合并单元格 * @param {} grid 要合并单元格的grid对 ...
- How to copy projects into workspace of eclipse after importing the project?
在eclipse中如果已经导入了一个别处的项目但导入时没有选“copy projects into workspace”怎么办? 答案是删掉该项目重新导入... http://stackoverflo ...
- Bluetooth篇 开发实例之八 匹配
自己写的App匹配蓝牙设备,不需要通过系统设置去连接. 匹配和通信是两回事. 用过Android系统设置(Setting)的人都知道蓝牙搜索之后可以建立配对和解除配对,但是这两项功能的函数没有在SDK ...
- debug with Linux slub allocator
http://thinkiii.blogspot.jp/2014/02/debug-with-slub-allocator.html The slub allocator in Linux has ...
- CSS3快速浏览器前缀的方法
在做前端开发时,经常要在css3的属性前加上各浏览器厂商的前缀:,如 Chrome(谷歌浏览器) :-webkit- Safari(苹果浏览器) :-webkit- Firefox(火狐浏览器) :- ...
- 关于宏:container_of和 offsetof以及list_for_each_entry
1.offsetof(TYPE, MEMBER) #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) offse ...
- MySQL实现删除数据左右空格trim() 左空格ltrim() 右空格rtrim()
2017-03-23 select trim(字段) from 表 删除左右空格 select ltrim(字段) from 表 删除左空格 select rtrim(字 ...
- 【Javascript 基础】对象
1 创建对象 Javascript 支持对象的概率.有多种方法可以用来创建对象. <!DOCTYPE html> <html lang="en"> < ...