看到上面需求,第一反应是做成类似新浪自定义tabbar 按钮形式,评估了一下工期,时间太紧,就想着用原生的Tabbar 能否实现功能。首先遇到的最大问题就是,如何阻断tabbar 按钮的点击事件,让其点击的时候不显示原定页面,而是执行我的自定义事件。
感谢前辈的分享,网上找到了对应的解决方案
点击了UITabBar的按钮之后,UITabBarController会执行UITabBarControllerDelegate的以下方法,并将要跳转到的UIViewController作为参数传递给一下代理方法。如果代理方法返回YES那么UITabBarController就会正常跳转,如果返回NO,那么就不会做跳转动作。方法如下:
- (BOOL)tabBarController:(UITabBarController*)tabBarController shouldSelectViewController:(UIViewController*)viewController
然后我们来看具体实现
// tabbar 点击之后 -(void)tabBarController:(UITabBarController *)tabBarController didSelectViewController: (UIViewController *)viewController{ // 记录当前被点击tabbar _currentIndex = tabBarController.selectedIndex; } // tabbar 是否点击 -(BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController{ // 判断是否点击中间 (加号)tabbar if ([viewController.childViewControllers[0] isKindOfClass:[SendViewController class]]) { // 点击之后发送通知,做相应处理 [[NSNotificationCenter defaultCenter]postNotificationName:@"sendVCSelected" object:[NSString stringWithFormat:@"%ld",(long)_currentIndex]]; return NO; } return YES; }
到这tabar 点击事件问题就已经解决了,下面来看下如何修改图标位置,设置正常与点击后图片效果、修改字体颜色等
修改按钮图片位置
tabItem.imageInsets = imageInsets;
修改前
修改后
设置正常与选中图片,取消系统图片渲染效果
图片不被渲染
UIImage * selectedImage = [UIImage imageNamed:selectImageStr]; UIImage * deselectImage = [UIImage imageNamed:deselectImageStr]; // 设置图片不被渲染 selectedImage = [selectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; deselectImage = [deselectImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
设置tabbar 选中与未选中图片
UITabBarItem * tabItem = [[UITabBarItem alloc] initWithTitle:title image:deselectImage selectedImage:selectedImage];
设置消息提示
tabItem.badgeValue = @"1";
统一设置tabbar 文字(选中后效果,其他状态下只需要修改UIControlStateSelected 即可)
设置tabbar 字体颜色、大小等(同理可设置navigationbar, 都是在bar) [[UITabBarItem appearance] setTitleTextAttributes:@{ NSForegroundColorAttributeName : [UIColor blackColor], NSFontAttributeName:[UIFont fontWithName:@"Marion-Italic" size:14.0] } forState:UIControlStateSelected];