RDVTabBarController
是一个用来自定义tabbar
的三方库,使用简单,不过隐藏tabbar的时候比较麻烦
用法:与系统tabbar
基本一样。
隐藏:可以在RootViewController
的viewWillAppear
与viewWillDisappear
中判断tabbar的隐藏与显示
问题:出现过一个诡异的bug,有时候跳转到tabbar
的root
页面中,tabbar
没有出现,还没有跟踪到问题的根由所在。
-(void) viewWillAppear:(BOOL)animated
{
[self.navigationController setNavigationBarHidden:self.hideNavigationBar animated:YES];
if (!self.navigationController) {
[[self rdv_tabBarController] setTabBarHidden:YES animated:NO];
return;
}
if (self.navigationController.viewControllers.count <= 1) {
[[self rdv_tabBarController] setTabBarHidden:NO animated:NO];
return;
}
[super viewWillAppear:animated];
if (self) {
[DataConversion beginLogPageView:NSStringFromClass([self class])];
}
}
-(void)viewWillDisappear:(BOOL)animated
{
if (self) {
[DataConversion endLogPageView:NSStringFromClass([self class])];
}
id cla=[self.navigationController.viewControllers lastObject];
if ([cla isKindOfClass:[HomeViewController class]]||[cla isKindOfClass:[YewuViewController class]]||[cla isKindOfClass:[SettingViewController class]]||[cla isKindOfClass:[MessageViewController class]]) {
[[self rdv_tabBarController] setTabBarHidden:NO animated:NO];
}
if (!self.navigationController) {
[[self rdv_tabBarController] setTabBarHidden:YES animated:NO];
return;
}
if (!self.navigationController.viewControllers.count) {
TabBarViewController *tab=(TabBarViewController *)[EquipmentInformation getCurrentViewController];
if ([tab isKindOfClass:[TabBarViewController class]]) {
tab.tabBarHidden=NO;
}
}
[super viewWillDisappear:animated];
}
RDVTabBarController
由RDVTabBarController
、RDVTabBar
、RDVTabBarItem
组成
//tabbar图片,对selectedImage与unselectedImage进行赋值 与 finishedSelectedImage、finishedUnselectedImage属性一致
- (void)setFinishedSelectedImage:(UIImage *)selectedImage withFinishedUnselectedImage:(UIImage *)unselectedImage
//title属性,tabbar的title
@property (nonatomic, copy) NSString *title;
然后在 RDVTabBarItem:UIControl 类中的
- (void)drawRect:(CGRect)rect
方法中用coreText
对img
与title
进行绘制
RDVTabBar : UIView
为RDVTabBarItem
添加点击事件,添加_backgroundView
//设置item的frame
- (void)layoutSubviews
//为item添加点击事件并添加到RDVTabBar上
- (void)setItems:(NSArray *)items {
for (RDVTabBarItem *item in _items) {
[item removeFromSuperview];
}
_items = [items copy];
for (RDVTabBarItem *item in _items) {
[item addTarget:self action:@selector(tabBarItemWasSelected:) forControlEvents:UIControlEventTouchDown];
[self addSubview:item];
}
}
RDVTabBarController : UIViewController
//添加tabbar上的所有viewController,对RDVTabBarItem进行初始化,并对[self tabBar]的items属性赋值。
@property (nonatomic, copy) IBOutletCollection(UIViewController) NSArray *viewControllers;
- (void)setViewControllers:(NSArray *)viewControllers {
NSMutableArray *tabBarItems = [[NSMutableArray alloc] init];
for (UIViewController *viewController in viewControllers) {
RDVTabBarItem *tabBarItem = [[RDVTabBarItem alloc] init];
[tabBarItem setTitle:viewController.title];
[tabBarItems addObject:tabBarItem];
[viewController rdv_setTabBarController:self];
}
[[self tabBar] setItems:tabBarItems];
}
//返回某个viewController
@property (nonatomic, weak) UIViewController *selectedViewController;