标签:
自定义导航栏
- (void)addTabBarButtonWithNormalImageName:(NSString *)norName andDisableImageName:(NSString *)disName
{
// 3.1创建按钮
LKTabBarBtn *btn = [[LKTabBarBtn 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.8设置tag
}
-(void)layoutSubviews
{
// 注意这是必须要写的不然会出现不可预知的错误
// [super layoutSubviews];
NSLog(@"self.subviews.count = %lu",(unsigned long)self.subviews.count);
for (int i = 0; i < self.subviews.count ; i++) {
// NSLog(@"self.subviews.count = %lu",(unsigned long)self.subviews.count);
UIButton *btn = self.subviews[i];
// 3.3设置frame
// NSLog(@"initWithFrame %@", NSStringFromCGRect(self.frame));
CGFloat btnY = 0;
CGFloat btnW = self.frame.size.width / 5;
CGFloat btnH = self.frame.size.height;
CGFloat btnX = i * btnW;
btn.frame = CGRectMake(btnX, btnY, btnW, btnH);
btn.tag = i;
}
}
-(void)btnOnClick:(LKTabBarBtn * )btn
{
// NSLog(@"按钮被点击了 = %ld",(long)btn.tag);
if ([self.delegate respondsToSelector:@selector(tarBarDidSelectBtnFrom:to:)]) {
[self.delegate tarBarDidSelectBtnFrom:self.selectBtn.tag to:btn.tag];
}
// 0.取消上一次选中的按钮
// self.selectBtn.selected = NO;
self.selectBtn.enabled = YES;
// 1.设置当前的点击的按钮的选中状态
btn.enabled = NO;
// 2.记录当前的按钮
self.selectBtn = btn;
// 3.切换控制器
}
数据的传递通过代理
@protocol LKTabBarDelegate <NSObject>
-(void)tarBarDidSelectBtnFrom:(NSInteger)from to:(NSInteger)to;
@end
@interface LKTabBar : UIView
@property (nonatomic, weak) id<LKTabBarDelegate> delegate;
- (void)addTabBarButtonWithNormalImageName:(NSString *)norName andDisableImageName:(NSString *)disName;
@end
控制器操作
// 1.新建一个tabBar
LKTabBar * myTabBar = [[LKTabBar alloc]init];
// myTabBar.backgroundColor = [UIColor redColor];
myTabBar.frame = self.tabBar.bounds;
// 设置代理事件
myTabBar.delegate = self;
[self.tabBar addSubview:myTabBar];
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];
控制器的跳转
-(void)tarBarDidSelectBtnFrom:(NSInteger)from to:(NSInteger)to
{
self.selectedIndex = to;
NSLog(@"to = %ld",(long)to);
}
巧妙的使用父类
//只是调用一次
+(void)initialize
{
// NSLog(@"initialize");
// 1.设置导航条的主题
// 如果要同时设置很多UINavigationBar的样式, 可以通过设置UINavigationBar的主题的方式来设置以便简化代码
UINavigationBar *navBar = [UINavigationBar appearance];
// 1.1设置所有导航条的背景图片
// 判断当前运行的操作系统的版本
if ([[UIDevice currentDevice].systemVersion doubleValue] > 7.0) {
[navBar setBackgroundImage:[UIImage imageNamed:@"NavBar64"] forBarMetrics:UIBarMetricsDefault];
}else
{
[navBar setBackgroundImage:[UIImage imageNamed:@"NavBar"] forBarMetrics:UIBarMetricsDefault];
}
// 设置导航条上返回按钮和图片的颜色
[navBar setTintColor:[UIColor whiteColor]];
// 1.2设置所有导航条的标题颜色
NSMutableDictionary *md = [NSMutableDictionary dictionary];
md[NSFontAttributeName] = [UIFont systemFontOfSize:16];
md[NSForegroundColorAttributeName] = [UIColor whiteColor];
[navBar setTitleTextAttributes:md];
// 1.3设置UIBarButtonItem的主题
UIBarButtonItem *barItem = [UIBarButtonItem appearance];
// 判断是否是IOS6 如果是IOS6就设置图片
if (!([[UIDevice currentDevice].systemVersion doubleValue] > 7.0)) {
// 设置普通按钮的图片
UIImage *norImage = [UIImage imageNamed:@"NavButton"];
[barItem setBackgroundImage:norImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
UIImage *higImage = [UIImage imageNamed:@"NavButtonPressed"];
[barItem setBackgroundImage:higImage forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault];
// 设置返回按钮的图片
UIImage *norBackImage = [UIImage imageNamed:@"NavBackButton"];
[barItem setBackButtonBackgroundImage:norBackImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
UIImage *higBackImage = [UIImage imageNamed:@"NavBackButtonPressed"];
[barItem setBackButtonBackgroundImage:higBackImage forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault];
}else
{
// 是IOS7
NSMutableDictionary *barMd = [NSMutableDictionary dictionary];
barMd[NSFontAttributeName] = [UIFont systemFontOfSize:16];
barMd[NSForegroundColorAttributeName] = [UIColor whiteColor];
[barItem setTitleTextAttributes:barMd forState:UIControlStateNormal];
}
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
-(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated{
// // 拿到目标控制器(即将要入栈的控制器), 设置它的自动隐藏tabbar
// viewController.hidesBottomBarWhenPushed = YES;
// [super pushViewController:viewController animated:animated];
// 拿到目标的控制器(即将要入栈的控制器),设置它的自动隐藏的tabBar
viewController.hidesBottomBarWhenPushed = YES;
[super pushViewController:viewController animated:YES];
}
标签:
原文地址:http://www.cnblogs.com/LennyKwok/p/4346644.html