控制器容器之UITabBarController

模块设计

类似UINavigationController,UITabBarController也是个容器,里面的UIViewController共用一个控制台UITabBar,每个UIViewController都可以定制自己的title和image等,开发者需要为每个UIViewController都创建一个UITabBarItem,用于修改控制台上面的内容。

控制器容器之UITabBarController_第1张图片
UITabBarController.png

类似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,具体的流程如下

  1. 自动布局_UIBadgeView
  2. 获取控件_UIBadgeView
  3. 改掉控件_UIBadgeView

UITabBar

通过UITabBar可以修标签栏的title和image等,修改方式分为两种

  • 单独设置:tabBar
  • 全局设置:[UITabBar appearance]

你可能感兴趣的:(控制器容器之UITabBarController)