实现效果如下:
实现逻辑主要是在RDVTabBarController方法中添加一个UIButton,来遮住原来的TabItem
#import "RDVTabBarController.h" #import "RDVTabBarItem.h" #import <objc/runtime.h> @interface UIViewController (RDVTabBarControllerItemInternal) - (void)rdv_setTabBarController:(RDVTabBarController *)tabBarController; @end @interface RDVTabBarController () { UIView *_contentView; UIButton *_centerBtn; CGRect _frameBtn; } @property (nonatomic, readwrite) RDVTabBar *tabBar; @end @implementation RDVTabBarController #pragma mark - View lifecycle - (void)viewDidLoad { [super viewDidLoad]; [self.view addSubview:[self contentView]]; [self.view addSubview:[self tabBar]]; NSUInteger index = self.viewControllers.count/2; RDVTabBarItem *item = self.tabBar.items[index]; UIImage *image = item.finishedSelectedImage; CGSize imageSize = [image size]; imageSize = CGSizeMake(imageSize.width/3*2, imageSize.height/3*2); CGRect frame = [UIScreen mainScreen].bounds; float width = frame.size.width/(self.viewControllers.count-1); UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem]; btn.frame = CGRectMake((frame.size.width-width)/2, frame.size.height-width, width, width); btn.backgroundColor = KTabBarBackgroundColor; btn.layer.cornerRadius = width/2; btn.layer.borderWidth = 2; btn.layer.borderColor = HEX_COLOR(@"d0d0d8").CGColor; btn.adjustsImageWhenDisabled = NO; [btn setImage:image forState:UIControlStateNormal]; [btn setTintColor:KUnSelectedTitleAttributes]; [btn setTitle:item.title forState:UIControlStateNormal]; [btn setContentHorizontalAlignment:UIControlContentHorizontalAlignmentCenter]; [btn setImageEdgeInsets:UIEdgeInsetsMake((width-imageSize.height)/2-10, (width-imageSize.width)/2, (width-imageSize.width)/2+10, (width-imageSize.width)/2)]; if(WIDTH == 320){ btn.titleLabel.font = [UIFont systemFontOfSize:11.0f]; [btn setTitleEdgeInsets:UIEdgeInsetsMake(28, -30, 0, 5)]; }else{ btn.titleLabel.font = [UIFont systemFontOfSize:14.0f]; [btn setTitleEdgeInsets:UIEdgeInsetsMake(35, -33, 0, 5)]; } btn.tag = index; [btn addTarget:self action:@selector(clickCenterBtn:) forControlEvents:UIControlEventTouchUpInside]; _centerBtn = btn; [_centerBtn setAdjustsImageWhenHighlighted:NO]; <span style="font-family: Arial, Helvetica, sans-serif;">[self.view addSubview:_centerBtn];</span> _frameBtn = _centerBtn.frame; } - (IBAction)clickCenterBtn:(UIButton*)sender{ if ([[self delegate] respondsToSelector:@selector(tabBarController:shouldSelectViewController:)]) { if (![[self delegate] tabBarController:self shouldSelectViewController:[self viewControllers][sender.tag]]) { return; } } if ([self selectedViewController] == [self viewControllers][sender.tag]) { if ([[self selectedViewController] isKindOfClass:[UINavigationController class]]) { UINavigationController *selectedController = (UINavigationController *)[self selectedViewController]; if ([selectedController topViewController] != [selectedController viewControllers][0]) { [selectedController popToRootViewControllerAnimated:YES]; } } return; } [self setSelectedIndex:sender.tag]; if ([[self delegate] respondsToSelector:@selector(tabBarController:didSelectViewController:)]) { [[self delegate] tabBarController:self didSelectViewController:[self viewControllers][sender.tag]]; } [sender setTintColor:KSelectedTitleAttributes]; }
隐藏显示tabbar
- (void)setTabBarHidden:(BOOL)hidden animated:(BOOL)animated { _tabBarHidden = hidden; __weak RDVTabBarController *weakSelf = self; #ifdef HMC //上下出现 void (^block)() = ^{ CGSize viewSize = weakSelf.view.bounds.size; CGFloat tabBarStartingY = viewSize.height; CGFloat contentViewHeight = viewSize.height; CGFloat tabBarHeight = CGRectGetHeight([[weakSelf tabBar] frame]); if (!tabBarHeight) { tabBarHeight = 49; } if (!hidden) { tabBarStartingY = viewSize.height - tabBarHeight; if (![[weakSelf tabBar] isTranslucent]) { contentViewHeight -= ([[weakSelf tabBar] minimumContentHeight] ?: tabBarHeight); } [[weakSelf tabBar] setHidden:NO]; } [[weakSelf tabBar] setFrame:CGRectMake(0, tabBarStartingY, viewSize.width, tabBarHeight)]; [[weakSelf contentView] setFrame:CGRectMake(0, 0, viewSize.width, contentViewHeight)]; }; #else //水平出现 void (^block)() = ^{ CGRect frame = [[weakSelf tabBar] frame]; frame.origin.y = HEIGHT - 49; frame.size = CGSizeMake(WIDTH, 49); if(!hidden){ _centerBtn.frame = _frameBtn; frame.origin.x = 0; [[weakSelf tabBar] setHidden:NO]; }else{ CGRect frameBtn = _frameBtn; frameBtn.origin.x -= WIDTH; _centerBtn.frame = frameBtn; frame.origin.x = -WIDTH; } [[weakSelf tabBar] setFrame:frame]; [[weakSelf contentView] setFrame:CGRectMake(0, 0, WIDTH, HEIGHT)]; }; #endif void (^completion)(BOOL) = ^(BOOL finished){ if (hidden) { [[weakSelf tabBar] setHidden:YES]; } }; if (animated) { [UIView animateWithDuration:0.24 animations:block completion:completion]; } else { block(); completion(YES); } }