标签:
一、自定义的思路
自定义TabBar的原则:尽量利用系统自带TabBar,只改需要改的地方。
二、自定义TabBar的总体过程
1.先把自带的TabBar条给取消了
2.自己做一个view,上面放几个按钮,设定按钮的点击事件.并设置selectIndex。
3.关联各个子viewController,覆盖相关事件。
三、细节很重要
1. 让自己创建的按钮关联到viewController:
?用tabbar的selectedIndex属性.设置这个属性就行了.
2. 取消系统的高亮:
?可以自定义一个按钮.重写里面的setHighhighted方法,什么也不做就行了.(如果调用super就相当于没写)
3. 关于几个按钮只选中一个的方法:
?设置一个属性,记录上一个选中的按钮.
?点击当前按钮时,把上一个按钮设置为未选中,并把当前按钮设置为选中,最后把当前按钮赋值给上一个按钮.
四、初步自定义
直接上代码,详见注释。
XNTabBarController.h
-
#import <UIKit/UIKit.h>
-
-
@interface XNTabBarController : UITabBarController
-
-
@end
XNTabBarController.m
-
-
-
-
-
-
-
-
-
#import "XNTabBarController.h"
-
#import "Common.h"
-
#import "XNTabBarButton.h"
-
-
@interface XNTabBarController ()
-
-
-
-
@property (nonatomic, weak) UIButton *selectedBtn;
-
@end
-
-
@implementation XNTabBarController
-
-
- (void)viewDidLoad {
-
[super viewDidLoad];
-
-
-
-
LogFun;
-
LogSubviews(self.view);
-
-
-
-
CGRect rect = self.tabBar.frame;
-
[self.tabBar removeFromSuperview];
-
-
-
UIView *myView = [[UIView alloc] init];
-
myView.frame = rect;
-
myView.backgroundColor = [UIColor redColor];
-
[self.view addSubview:myView];
-
-
for (int i = 0; i < 5; i++) {
-
-
XNTabBarButton *btn = [[XNTabBarButton alloc] init];
-
-
NSString *imageName = [NSString stringWithFormat:@"TabBar%d", i + 1];
-
NSString *imageNameSel = [NSString stringWithFormat:@"TabBar%dSel", i + 1];
-
-
[btn setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal];
-
[btn setImage:[UIImage imageNamed:imageNameSel] forState:UIControlStateSelected];
-
-
CGFloat x = i * myView.frame.size.width / 5;
-
btn.frame = CGRectMake(x, 0, myView.frame.size.width / 5, myView.frame.size.height);
-
-
[myView addSubview:btn];
-
-
btn.tag = i;
-
-
-
[btn addTarget:self action:@selector(clickBtn:) forControlEvents:UIControlEventTouchUpInside];
-
-
-
if (0 == i) {
-
btn.selected = YES;
-
self.selectedBtn = btn;
-
}
-
}
-
}
-
-
-
-
-
- (void)clickBtn:(UIButton *)button {
-
-
self.selectedBtn.selected = NO;
-
-
button.selected = YES;
-
-
self.selectedBtn = button;
-
-
-
self.selectedIndex = button.tag;
-
}
-
-
@end
XNTabBarButton.h
-
#import <UIKit/UIKit.h>
-
-
@interface XNTabBarButton : UIButton
-
-
@end
XNTabBarButton.m
-
#import "XNTabBarButton.h"
-
-
@implementation XNTabBarButton
-
-
- (void)setHighlighted:(BOOL)highlighted{
-
-
}
-
-
@end
五、代码重构
重构的目的是把代码放到他最该到的地方去. 提高可读写与可拓展性。
对控件的重构要保证可重用性. 做到封装做其他应用时,可以直接拿过去用的地步.
tips :
1、关于init与initWithFrame:
?在对象初始化调用init时,会调用initWithFrame方法.
?Init与initWithFrame都会被调用.
?建议自定义控件不要重写init方法,需要初始化时重写initWithFrame方法.
?好处:其他人调用无论是调用init,还是调用initWithFrame都会调用initWithFrame方法.
2、关于控件的布局代码:
?建议写在layoutSubviews方法中.
?不要忘记写super方法
?将设置x,y,frame等写在这里面.
3、将自定义的Tabbar添加为系统TabBar的子视图,这样TabBar的切换自动隐藏/滑动功能就不用自己做了.
(hidebottombaronpush)
重构后的代码如下:
将自定义的TabBar单独建立,并将代码移过去。
设置代理方法,工具栏按钮被选中,记录从哪里跳转到哪里.
XNTabBar.h
-
#import <UIKit/UIKit.h>
-
@class XNTabBar;
-
-
@protocol XNTabBarDelegate <NSObject>
-
-
-
-
- (void) tabBar:(XNTabBar *)tabBar selectedFrom:(NSInteger) from to:(NSInteger)to;
-
-
@end
-
-
@interface XNTabBar : UIView
-
@property(nonatomic,weak) id<XNTabBarDelegate> delegate;
-
-
-
-
-
-
-
-(void)addButtonWithImage:(UIImage *)image selectedImage:(UIImage *) selectedImage;
-
@end
XNTabBar.m
原先的XNTabBarController.m经过修改后,注释了原先的代码。
自定义tabbar
标签:
原文地址:http://blog.csdn.net/it_zgc/article/details/50998070