模块设计
类似UINavigationController,UITabBarController也是个容器,里面的UIViewController共用一个控制台UITabBar,每个UIViewController都可以定制自己的title和image等,开发者需要为每个UIViewController都创建一个UITabBarItem,用于修改控制台上面的内容。
类似UINavigationController的类图,UITabBarController和UIViewController也有一组指针(viewControllers和tabBarController)指向对方。
UITabBarItem
通过UITabBarItem可以修改标签栏的title、image、selectedImage和badgeValue属性。
特性:修改标签栏未读数的背景颜色
解决方案:先获取未读数控件view,然后盖一个同等尺寸的label到其上,新label使用自定义的的背景颜色
具体实施起来需要解决两个问题
如何获取未读数控件view
如何获取未读数控件bounds
第一个问题:可以先使用kvc获取UITabBarItem对应的view,然后遍历其subview,了解其内部结构,最后取出未读数控件view。
//如下两种写法都可行
UIView *view = (UIView *)[self performSelector:@selector(view)];
UIView *view = [self valueForKey:@"view"];
接下来遍历view的subviews,获取类名为“_UIBadgeView”的subview。
[view.subviews enumerateObjectsUsingBlock:^(UIView *subview, NSUInteger idx, BOOL *stop) {
if ([subview isKindOfClass:NSClassFromString(@"_UIBadgeView")]) {
for (UIView *subsubview in subview.subviews) {
if (subsubview.tag == CUSTOM_BADGE_LABEL_TAG) {
[subsubview removeFromSuperview];
break;
}
}
UILabel *label = [[UILabel alloc] init];
label.tag = CUSTOM_BADGE_LABEL_TAG;
[subview addSubview:label];
*stop = YES;
}
}];
第二个问题:可以先调用系统接口[self setBadgeValue:value];自动布局_UIBadgeView,然后使用_UIBadgeView的bounds来设置自定义label,具体的流程如下
- 自动布局_UIBadgeView
- 获取控件_UIBadgeView
- 改掉控件_UIBadgeView
UITabBar
通过UITabBar可以修标签栏的title和image等,修改方式分为两种
- 单独设置:tabBar
- 全局设置:[UITabBar appearance]