自定义 TabBar
2015-09-24 10:20
429 查看
自定义 TabBar
常常系统的TabB不符合我们的要求,比如为了软件在各个iOS版本下的视图的兼容性,
往往不用系统的TabBar而是需要自定义TabBar。下面提供了方法来自定义:
我们在控制器里这样使用:
// 1、创建一个LZTabBar
LZTabBar *myTabBar = [[LZTabBar alloc]init];
myTabBar.frame = self.tabBar.bounds;
myTabBar.delegate = self;
[self.tabBar addSubview:myTabBar];
// 2、添加按钮到tabBar
NSString *selName = @"selImageName";
NSString *norName = @"norImageName";
[myTabBar addButtonWithNorName:norName selName:selName];
// 3、代理 -- 切换控制器
- (void)tabBar:(LZTabBar *)tabBar didSelectButtonFrom:(int)from to:(int)to {
self.selectedIndex = to;
}
自定义TabBar其实就是添加到tabBar的一个自定义UIView,他提供一个添加TabButton到
TabBar的方法 addButtonWithNorName: selName: :
// LZTabBar.h
#import <UIKit/UIKit.h>
@class LZTabBar;
/**
* 定义协议
*/
@protocol LZTabBarDelegate <NSObject>
/**
* 选中某个button
*
* @param tabBar LZTabBar
* @param from index button from
* @param to index button to tag
*/
- (void)tabBar:(LZTabBar *)tabBar didSelectButtonFrom:(int)from to:(int)to;
@optional
@end
@interface LZTabBar : UIView
/**
* 向LZTabBar添加按钮
*/
- (void)addButtonWithNorName:(NSString *)norName selName:(NSString *)selName;
/**
* LZTabBar 代理对象
*/
@property (nonatomic, weak) id <LZTabBarDelegate>
delegate;
@end
// LZTabBar.m
#import "LZTabBar.h"
#import "LZTabBarButton.h"
@interface LZTabBar ()
/**
* 记录被选中的button
*/
@property (nonatomic, weak) LZTabBarButton *selectedBtn;
@end
// 添加一个button到TabBar
- (void)addButtonWithNorName:(NSString *)norName selName:(NSString *)selName {
// 1、创建一个button,并设置他的背景图片 选中状态 和 正常状态
LZTabBarButton *btn = [LZTabBarButton buttonWithType:UIButtonTypeCustom];
[btn setBackgroundImage:
[UIImage imageNamed:norName ] forState:UIControlStateNormal];
[btn setBackgroundImage:
[UIImage imageNamed:selName ] forState:UIControlStateSelected];
// 2、为button绑定 监听方法,监听按下事件
[btn addTarget:self action:@selector(buttonSelcected:)
forControlEvents:UIControlEventTouchDown];
// 3、把这个button 添加到view里面去
[self addSubview:btn];
// 4、默认选中第一个控制器
if (self.subviews.count == 1) {
[self buttonSelcected:btn];
}
}
// 按钮按下事件处理
- (void)buttonSelcected: (LZTabBarButton *)btn {
// 1、通知代理,选中事件
if ([self.delegate respondsToSelector:
@selector(tabBar:didSelectButtonFrom:to:)]) {
[self.delegate tabBar:self
didSelectButtonFrom: (int)self.selectedBtn.tag to:
(int)btn.tag];
}
// 2、取消选中记录选中按钮的selected属性
self.selectedBtn.selected = NO;
// 3、设置当前按下按钮为选中状态
btn.selected = YES;
// 4、更新选中按钮
self.selectedBtn = btn;
}
// 重新布局时设置按钮的frame
- (void)layoutSubviews {
[super layoutSubviews];
/** 计算btn的frame*/
int count = (int)self.subviews.count;
for (int i = 0; i < count; i++) {
LZTabBarButton *btn = self.subviews[i];
btn.tag = i;
CGFloat btnY = 0;
CGFloat btnW = self.frame.size.width /
count;
CGFloat btnH = self.frame.size.height;
CGFloat btnX = i * btnW;
btn.frame = CGRectMake(btnX, btnY, btnW, btnH);
}
}
--------------------------------------------------------------------------------------------------------------
常常系统的TabB不符合我们的要求,比如为了软件在各个iOS版本下的视图的兼容性,
往往不用系统的TabBar而是需要自定义TabBar。下面提供了方法来自定义:
我们在控制器里这样使用:
// 1、创建一个LZTabBar
LZTabBar *myTabBar = [[LZTabBar alloc]init];
myTabBar.frame = self.tabBar.bounds;
myTabBar.delegate = self;
[self.tabBar addSubview:myTabBar];
// 2、添加按钮到tabBar
NSString *selName = @"selImageName";
NSString *norName = @"norImageName";
[myTabBar addButtonWithNorName:norName selName:selName];
// 3、代理 -- 切换控制器
- (void)tabBar:(LZTabBar *)tabBar didSelectButtonFrom:(int)from to:(int)to {
self.selectedIndex = to;
}
自定义TabBar其实就是添加到tabBar的一个自定义UIView,他提供一个添加TabButton到
TabBar的方法 addButtonWithNorName: selName: :
// LZTabBar.h
#import <UIKit/UIKit.h>
@class LZTabBar;
/**
* 定义协议
*/
@protocol LZTabBarDelegate <NSObject>
/**
* 选中某个button
*
* @param tabBar LZTabBar
* @param from index button from
* @param to index button to tag
*/
- (void)tabBar:(LZTabBar *)tabBar didSelectButtonFrom:(int)from to:(int)to;
@optional
@end
@interface LZTabBar : UIView
/**
* 向LZTabBar添加按钮
*/
- (void)addButtonWithNorName:(NSString *)norName selName:(NSString *)selName;
/**
* LZTabBar 代理对象
*/
@property (nonatomic, weak) id <LZTabBarDelegate>
delegate;
@end
// LZTabBar.m
#import "LZTabBar.h"
#import "LZTabBarButton.h"
@interface LZTabBar ()
/**
* 记录被选中的button
*/
@property (nonatomic, weak) LZTabBarButton *selectedBtn;
@end
// 添加一个button到TabBar
- (void)addButtonWithNorName:(NSString *)norName selName:(NSString *)selName {
// 1、创建一个button,并设置他的背景图片 选中状态 和 正常状态
LZTabBarButton *btn = [LZTabBarButton buttonWithType:UIButtonTypeCustom];
[btn setBackgroundImage:
[UIImage imageNamed:norName ] forState:UIControlStateNormal];
[btn setBackgroundImage:
[UIImage imageNamed:selName ] forState:UIControlStateSelected];
// 2、为button绑定 监听方法,监听按下事件
[btn addTarget:self action:@selector(buttonSelcected:)
forControlEvents:UIControlEventTouchDown];
// 3、把这个button 添加到view里面去
[self addSubview:btn];
// 4、默认选中第一个控制器
if (self.subviews.count == 1) {
[self buttonSelcected:btn];
}
}
// 按钮按下事件处理
- (void)buttonSelcected: (LZTabBarButton *)btn {
// 1、通知代理,选中事件
if ([self.delegate respondsToSelector:
@selector(tabBar:didSelectButtonFrom:to:)]) {
[self.delegate tabBar:self
didSelectButtonFrom: (int)self.selectedBtn.tag to:
(int)btn.tag];
}
// 2、取消选中记录选中按钮的selected属性
self.selectedBtn.selected = NO;
// 3、设置当前按下按钮为选中状态
btn.selected = YES;
// 4、更新选中按钮
self.selectedBtn = btn;
}
// 重新布局时设置按钮的frame
- (void)layoutSubviews {
[super layoutSubviews];
/** 计算btn的frame*/
int count = (int)self.subviews.count;
for (int i = 0; i < count; i++) {
LZTabBarButton *btn = self.subviews[i];
btn.tag = i;
CGFloat btnY = 0;
CGFloat btnW = self.frame.size.width /
count;
CGFloat btnH = self.frame.size.height;
CGFloat btnX = i * btnW;
btn.frame = CGRectMake(btnX, btnY, btnW, btnH);
}
}
--------------------------------------------------------------------------------------------------------------
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 批量自动安装常用软件
- 批量自动安装常用软件
- 企业批量部署RealVNC远程控制软件
- 好用的Markdown编辑器一览
- 网上视频站 视频下载利器 优酷网 视频下载 必备 软件 下载[原创]_常用工具_脚本之家
- BAT批处理实现软件的自动安装(以搜狗拼音为例)
- nw.js实现类似微信的聊天软件
- 采用C#实现软件自动更新的方法
- C#判断某个软件是否已安装实现代码分享
- IIS 防盗链 软件
- js判断客户端是iOS还是Android等移动终端的方法
- IOS开发环境windows化攻略