AJ分享,必须精品

效果:

代码:

NYTabBarController


//
// NYTabBarController.m
// 彩票lottery
//
// Created by apple on 15-5-9.
// Copyright (c) 2015年 znycat. All rights reserved.
// #import "NYTabBarController.h"
#import "NYTabBar.h"
#import "NYTabBarButton.h" @interface NYTabBarController () <NYTabBarDelegate> @end
@implementation NYTabBarController -(void)viewDidLoad
{
[super viewDidLoad];
// 1.创建自定义的TabBar
NYTabBar * myTabBar = [[NYTabBar alloc]initWithFrame:self.tabBar.frame];
//设置代理
myTabBar.delegate = self; [self.view addSubview:myTabBar];
// 1.1根据系统子控制器的个数来创建自定义TabBar上按钮的个数
for (int i = 0; i<self.viewControllers.count; i++) {
// 通知自定义TabBar创建按钮
NSString *norImageName = [NSString stringWithFormat:@"TabBar%d", i + 1];
NSString *disableImageName = [NSString stringWithFormat:@"TabBar%dSel", i + 1];
// 只要调用自定义TabBar的该方法就会创建一个按钮
[myTabBar addTabBarButtonWithNormalImageName:norImageName andDisableImageName:disableImageName];
} // 2.删除系统自带的tabBar
[self.tabBar removeFromSuperview]; // 3.设置导航条的主题
// 如果要同时设置很多UINavigationBar的样式, 可以通过设置UINavigationBar的主题的方式来设置以便简化代码
UINavigationBar *navBar = [UINavigationBar appearance];
// 3.1设置所有导航条的背景图片
// 判断当前运行的操作系统的版本
if ([[UIDevice currentDevice].systemVersion doubleValue] >= 7.0) {
[navBar setBackgroundImage:[UIImage imageNamed:@"NavBar64"] forBarMetrics:UIBarMetricsDefault];
}else {
[navBar setBackgroundImage:[UIImage imageNamed:@"NavBar"] forBarMetrics:UIBarMetricsDefault]; } // 3.2设置所有导航条的标题颜色
NSMutableDictionary *md = [NSMutableDictionary dictionary];
md[NSFontAttributeName] = [UIFont systemFontOfSize:17];
md[NSForegroundColorAttributeName] = [UIColor whiteColor];
[navBar setTitleTextAttributes:md];
} #pragma mark - NYTabBarDelegate
-(void)tabBarDidSelectBtnFrom:(NSInteger)from to:(NSInteger)to
{
self.selectedIndex = to;
} @end

NYTabBar

NYTabBar.h

//
// NYTabBar.h
// 彩票lottery
//
// Created by apple on 15-5-9.
// Copyright (c) 2015年 znycat. All rights reserved.
// #import <UIKit/UIKit.h> @protocol NYTabBarDelegate <NSObject> -(void)tabBarDidSelectBtnFrom:(NSInteger)from to:(NSInteger) to; @end @interface NYTabBar : UIView @property (nonatomic, weak) id<NYTabBarDelegate> delegate; /**
* 提供给外界创建按钮
*
* @param norName 默认状态的图片
* @param disName 高亮状态的图片
*/
-(void)addTabBarButtonWithNormalImageName:(NSString *)norImageName andDisableImageName:(NSString *)disableImageName; @end

NYTabBar.m

//
// NYTabBar.m
// 彩票lottery
//
// Created by apple on 15-5-9.
// Copyright (c) 2015年 znycat. All rights reserved.
// #import "NYTabBar.h"
#import "NYTabBarButton.h"
@interface NYTabBar()
// 定义变量记录当前选中的按钮
@property (nonatomic, weak) UIButton *selectBtn; @end
@implementation NYTabBar - (void)layoutSubviews
{
[super layoutSubviews]; for (int i = 0; i < self.subviews.count ; i++) { UIButton *btn = self.subviews[i]; // 3.3设置frame
CGFloat btnY = 0;
CGFloat btnW = self.frame.size.width / self.subviews.count;
CGFloat btnH = self.frame.size.height;
CGFloat btnX = i * btnW;
btn.frame = CGRectMake(btnX, btnY, btnW, btnH); // 3.8设置按钮的Tag作为将来切换子控制器的索引
btn.tag = i;
}
} - (void)addTabBarButtonWithNormalImageName:(NSString *)norName andDisableImageName:(NSString *)disName
{
// 3.1创建按钮
NYTabBarButton *btn = [[NYTabBarButton alloc] init];
// 3.2设置按钮上显示的图片
// 3.2.1设置默认状态图片
[btn setBackgroundImage:[UIImage imageNamed:norName] forState:UIControlStateNormal]; // 3.2.2设置不可用状态图片
[btn setBackgroundImage:[UIImage imageNamed:disName] forState:UIControlStateDisabled]; // 3.4添加按钮到自定义TabBar
[self addSubview:btn]; // 3.5监听按钮点击事件
[btn addTarget:self action:@selector(btnOnClick:) forControlEvents:UIControlEventTouchDown]; // 3.6设置默认选中按钮
if (1 == self.subviews.count) {
[self btnOnClick:btn];
} // 3.7设置按钮高亮状态不调整图片
btn.adjustsImageWhenHighlighted = NO;
} //按钮点击事件
-(void)btnOnClick:(UIButton *)btn
{
// 3.切换子控制器
// 通知TabBarController切换控制器
if ([self.delegate respondsToSelector:@selector(tabBarDidSelectBtnFrom:to:) ]) {
[self.delegate tabBarDidSelectBtnFrom:self.selectBtn.tag to:btn.tag];
} // 0.取消上一次选中的按钮
self.selectBtn.enabled = YES; // 1.设置当前被点击按钮为选中状态
btn.enabled = NO; // 2.记录当前选中的按钮
self.selectBtn = btn; } @end

NYTabBarButton

//
// NYTabBarButton.m
// 彩票lottery
//
// Created by apple on 15-5-9.
// Copyright (c) 2015年 znycat. All rights reserved.
// #import "NYTabBarButton.h" @implementation NYTabBarButton - (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
}
return self;
} /**重写这个方法后,按钮就不会自己调用系统内置的复杂的高亮操作*/
-(void)setHighlighted:(BOOL)highlighted
{ }
@end

实现过程

能看懂代码就不用看这个了,代码中的注释也非常清楚

为啥要弄自定义的TabBar这些不说了,直接说过程。

首先,系统开始了我们加载NYTabBarController的viewDidLoad方法

第一步:创建自定义的TabBar,因为系统的TabBar不满足我们的需求,啥是TabBar?看图。

代码:

 // 1.创建自定义的TabBar
NYTabBar * myTabBar = [[NYTabBar alloc]initWithFrame:self.tabBar.frame];

NYTabBar里面是啥呢?很简单,就是重写了个方法,让他不高亮了。

/**重写这个方法后,按钮就不会自己调用系统内置的复杂的高亮操作*/
-(void)setHighlighted:(BOOL)highlighted
{
}

第二部:根据系统子控制器(ViewController)的个数来创建自定义TabBar上按钮的个数

for (int i = 0; i<self.viewControllers.count; i++) {
// 通知自定义TabBar创建按钮
NSString *norImageName = [NSString stringWithFormat:@"TabBar%d", i + 1];
NSString *disableImageName = [NSString stringWithFormat:@"TabBar%dSel", i + 1];
// 只要调用自定义TabBar的该方法就会创建一个按钮
[myTabBar addTabBarButtonWithNormalImageName:norImageName andDisableImageName:disableImageName];
}

这里需要补充下了,这个彩票主要框架不是纯代码,是用stroyboard拖拽的,很方便也很快,简单一个图。

第三部:就是方法内部了,怎么设置按钮,以及各种各样的需求,比如我们的按钮要点了后直接变色,有要求按钮点击后切换子控制器,等等,代码中描述的很清楚,面向对象的思想,这一步其实不应该算大的里面的,不过他挺重要的,就弄上了。

首先是:-(void)addTabBarButtonWithNormalImageName:(NSString )norImageName andDisableImageName:(NSString )disableImageName;
这个方法。

/**
* 提供给外界创建按钮
*
* @param norName 默认状态的图片
* @param disName 高亮状态的图片
*/
- (void)addTabBarButtonWithNormalImageName:(NSString *)norName andDisableImageName:(NSString *)disName
{
// 3.1创建按钮
NYTabBarButton *btn = [[NYTabBarButton alloc] init];
// 3.2设置按钮上显示的图片
// 3.2.1设置默认状态图片
[btn setBackgroundImage:[UIImage imageNamed:norName] forState:UIControlStateNormal]; // 3.2.2设置不可用状态图片
[btn setBackgroundImage:[UIImage imageNamed:disName] forState:UIControlStateDisabled]; // 3.4添加按钮到自定义TabBar
[self addSubview:btn]; // 3.5监听按钮点击事件
[btn addTarget:self action:@selector(btnOnClick:) forControlEvents:UIControlEventTouchDown]; // 3.6设置默认选中按钮
if (1 == self.subviews.count) {
[self btnOnClick:btn];
} // 3.7设置按钮高亮状态不调整图片
btn.adjustsImageWhenHighlighted = NO;
}

然后上面有

 // 3.1创建按钮
NYTabBarButton *btn = [[NYTabBarButton alloc] init];

创建按钮这一操作,这时候系统会执行layoutSubviews这一方法,然后我们需要算好他的frame

- (void)layoutSubviews
{
[super layoutSubviews]; for (int i = 0; i < self.subviews.count ; i++) { UIButton *btn = self.subviews[i]; // 3.3设置frame
CGFloat btnY = 0;
CGFloat btnW = self.frame.size.width / self.subviews.count;
CGFloat btnH = self.frame.size.height;
CGFloat btnX = i * btnW;
btn.frame = CGRectMake(btnX, btnY, btnW, btnH); // 3.8设置按钮的Tag作为将来切换子控制器的索引
btn.tag = i;
}
}

接下来就是点击事件的实现了,简单的让按钮变成不可按下的状态,然后通过点击把当前按钮的tag传给代理来让代理来实现。

//按钮点击事件
-(void)btnOnClick:(UIButton *)btn
{
// 3.切换子控制器
// 通知TabBarController切换控制器
if ([self.delegate respondsToSelector:@selector(tabBarDidSelectBtnFrom:to:) ]) {
[self.delegate tabBarDidSelectBtnFrom:self.selectBtn.tag to:btn.tag];
} // 0.取消上一次选中的按钮
self.selectBtn.enabled = YES; // 1.设置当前被点击按钮为选中状态
btn.enabled = NO; // 2.记录当前选中的按钮
self.selectBtn = btn; }

这个就是定义协议了,为代理能快速提示准备的。

#import <UIKit/UIKit.h>

@protocol NYTabBarDelegate <NSObject>

-(void)tabBarDidSelectBtnFrom:(NSInteger)from to:(NSInteger) to;

@end

@interface NYTabBar : UIView

@property (nonatomic, weak) id<NYTabBarDelegate> delegate;

/**
* 提供给外界创建按钮
*
* @param norName 默认状态的图片
* @param disName 高亮状态的图片
*/
-(void)addTabBarButtonWithNormalImageName:(NSString *)norImageName andDisableImageName:(NSString *)disableImageName; @end

第四步: 设置代理,这个为了实现切换自控制器效果,实现点击事件用的,看第三部。还有要把自定义的TabBar添加到view上面(常识。。。)

    //设置代理
myTabBar.delegate = self; [self.view addSubview:myTabBar];

代理得到tag值后怎么完成的呢?很简单。
TabBarController中有个selectedIndex属性,这个就是你选中哪一个了。

#pragma mark - NYTabBarDelegate
-(void)tabBarDidSelectBtnFrom:(NSInteger)from to:(NSInteger)to
{
self.selectedIndex = to;
}

比如这时候,self.selectedIndex 就是0了。

删除系统自带的tabBar,不解释,自己定义了再放个别人的。苹果性能高也不能这么玩。

// 2.删除系统自带的tabBar
[self.tabBar removeFromSuperview];

设置导航条的主题(图片,标题),判断当前系统版本来设置背景图片,

 // 3.设置导航条的主题
// 如果要同时设置很多UINavigationBar的样式, 可以通过设置UINavigationBar的主题的方式来设置以便简化代码
UINavigationBar *navBar = [UINavigationBar appearance];
// 3.1设置所有导航条的背景图片
// 判断当前运行的操作系统的版本
if ([[UIDevice currentDevice].systemVersion doubleValue] >= 7.0) {
[navBar setBackgroundImage:[UIImage imageNamed:@"NavBar64"] forBarMetrics:UIBarMetricsDefault];
}else {
[navBar setBackgroundImage:[UIImage imageNamed:@"NavBar"] forBarMetrics:UIBarMetricsDefault]; } // 3.2设置所有导航条的标题颜色
NSMutableDictionary *md = [NSMutableDictionary dictionary];
md[NSFontAttributeName] = [UIFont systemFontOfSize:17];
md[NSForegroundColorAttributeName] = [UIColor whiteColor];
[navBar setTitleTextAttributes:md];

整个过程差不多就这样子了。

注意点:

开始进入时隐藏状态栏,进入后显示

这样:

然后:

实现方法:

#import "NYAppDelegate.h"

@implementation NYAppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//隐藏状态栏,ios7之后默认交给控制器管理。要想让application管理,需要添加属性
// View controller-based status bar appearance NO 到 info.plist文件中。
//显示状态栏
application.statusBarHidden = NO; //设置状态栏颜色
application.statusBarStyle = UIStatusBarStyleLightContent; return YES;
}
@end

点击按钮去掉高亮

/**重写这个方法后,按钮就不会自己调用系统内置的复杂的高亮操作*/
-(void)setHighlighted:(BOOL)highlighted
{ }

还有这个

    // 3.7设置按钮高亮状态不调整图片
btn.adjustsImageWhenHighlighted = NO;

设置导航条的主题,以及当前系统版本

/ 3.设置导航条的主题
// 如果要同时设置很多UINavigationBar的样式, 可以通过设置UINavigationBar的主题的方式来设置以便简化代码
UINavigationBar *navBar = [UINavigationBar appearance];
// 3.1设置所有导航条的背景图片
// 判断当前运行的操作系统的版本
if ([[UIDevice currentDevice].systemVersion doubleValue] >= 7.0) {
[navBar setBackgroundImage:[UIImage imageNamed:@"NavBar64"] forBarMetrics:UIBarMetricsDefault];
}else {
[navBar setBackgroundImage:[UIImage imageNamed:@"NavBar"] forBarMetrics:UIBarMetricsDefault]; } // 3.2设置所有导航条的标题颜色
NSMutableDictionary *md = [NSMutableDictionary dictionary];
md[NSFontAttributeName] = [UIFont systemFontOfSize:17];
md[NSForegroundColorAttributeName] = [UIColor whiteColor];
[navBar setTitleTextAttributes:md];

AJ学IOS(43)之网易彩票底部自定义TabBar实现切换的更多相关文章

  1. AJ学IOS 之微博项目实战(4)微博自定义tabBar中间的添加按钮

    AJ分享,必须精品 一:效果图 自定义tabBar实现最下面中间的添加按钮 二:思路 首先在自己的tabBarController中把系统的tabBar设置成自己的tabBar(NYTabBar),这 ...

  2. AJ学IOS 之微博项目实战(2)微博主框架-自定义导航控制器NavigationController

    AJ分享,必须精品 一:添加导航控制器 上一篇博客完成了对底部的TabBar的设置,这一章我们完成自定义导航控制器(NYNavigationController). 为啥要做自定义呢,因为为了更好地封 ...

  3. AJ学IOS(13)UI之UITableView学习(下)汽车名牌带右侧索引

    AJ分享,必须精品 先看效果图 代码 ViewController #import "NYViewController.h" #import "NYCarGroup.h& ...

  4. AJ学IOS(16)UI之XIB自定义Cell实现团购UI

    AJ分享,必须精品 先看效果图 自定义Cell 本次主要是自定义Cell的学习 实现自定义Cell主要有三种方法:按照使用的频繁度排序: XIB > 纯代码 > StoryBoard XI ...

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

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

  6. AJ学IOS(44)之网易彩票自定义图片在右边的Button_弹出view_ios6,7简单适配

    AJ分享,必须精品 效果: 注意图里面了吗,其实那个效果做起来真的很简单,在iOS中苹果给我们封装的很好,关键是那个按钮 系统的按钮的图片是在左边的,这里我们需要把他调整到右边,然后呢需要我们自己做一 ...

  7. AJ学IOS(47)之网易彩票帮助界面UIWebView的运用

    AJ分享,必须精品 效果: 制作过程 首先是帮助按钮那个地方的点击. 这里是用点击跳转的用的是 NJSettingArrowItem,前面的设置的,从字典通过模型转过来的. // 分享 NJSetti ...

  8. AJ学IOS(46)之网易彩票幸运大转盘

    AJ分享,必须精品 效果 实现过程: 基础UI搭建 这里主要是用了xib搭建,首先我们分析,有中间的开始按钮,背景图片,还有星座按钮,这里能用xib做的事开始按钮和背景图片. 如图: 星座按钮的搭建: ...

  9. AJ学IOS(42)UI之核心动画CAAnimationGroup以及其他

    AJ分享,必须精品 效果: 代码: 很简单,不多说,就是把一堆动画放一起,看代码. - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent * ...

随机推荐

  1. 大数据软件安装之Hive(查询)

    一.安装及配置 官方文档: https://cwiki.apache.org/confluence/display/Hive/GettingStarted 安装Hive2.3 1)上传apache-h ...

  2. axios Api介绍

    1.Performing a GET request axios.get('/user?ID=12345') .then(function (response) { // handle success ...

  3. Linux---使用kill杀不掉进程解决方案

    今天打开Linux虚拟机,然后使用jps命令查看,莫名奇妙多了一个1889进程 然后使用kill杀掉后,再运行jps还是存在此进程.于是乎开始大量百度,最终找到了解决方案. 说的很清楚了,杀不掉的原因 ...

  4. SQL语句中,如何使用含有if....else...判断语句

    在我们开发中,有时要对数据库中的数据按照条件进行查询,用到if else类似的语句进行判断,那么if else语句只有在存储过程,触发器之类的才有,但是要在sql上当满足某种条件上要取不同的字段值,刚 ...

  5. selenium3浏览器驱动设置

    设置浏览器驱动: 1.首先手动创建一个存放浏览器驱动的目录,如: C:\driver , 将下载的浏览器驱动文件(例如:chromedriver.geckodriver)丢到该目录下. 2.打开计算机 ...

  6. 【原创】基于RBI的性能测试理念,通过jmeter快速定位接口最大并发用户数

    测试工具:jmeter v_5.2 测试对象:某网站的物料获取接口,需登录后操作 测试目的:快速定位该接口最大并发用户数 思路&步骤: 1.模拟一个场景,某天临近下班,主管突然过来让你测下你们 ...

  7. ASP.NET Core 3.x 中间件流程与路由体系

    中间件分类 ASP.NET Core 中间件的配置方法可以分为以上三种,对应的Helper方法分别是:Run(), Use(), Map(). Run(),使用Run调用中间件的时候,会直接返回一个响 ...

  8. 201771010103 陈亚茹 《面向对象程序设计(java)》第一周学习总结

    本人学号<面向对象程序设计(java)>第一周学习总结 第一部分:课程准备部分 填写课程学习 平台注册账号, 平台名称 注册账号 博客园:www.cnblogs.com https://w ...

  9. 升级 nop 4.1 Incorrect syntax near 'OFFSET'. Invalid usage of the option NEXT in the FETCH statement.

    Incorrect syntax near 'OFFSET'.  Invalid usage of the option NEXT in the FETCH statement. nop.web 项目 ...

  10. PyTorch专栏开篇

    目前研究人员正在使用的深度学习框架不尽相同,有 TensorFlow .PyTorch.Keras等.这些深度学习框架被应用于计算机视觉.语音识别.自然语言处理与生物信息学等领域,并获取了极好的效果. ...