我创建了UITabBarController的子类,它在选项卡顶部添加了一个自定义UIView来替换UITabBarItem上的默认标记。我在自定义UITabBarController的viewDidLoad上添加了这些自定义徽章视图。
[self.view addSubview:_tabBarItem1BadgeView];
我的自定义tabBarBadgeView上的drawRect如下所示:
- (void)drawRect:(CGRect)rect{
CGContextRef ctx = UIGraphicsGetCurrentContext();
// Badge
CGSize size = self.frame.size;
CGSize badgeSize = [self sizeThatFits:size];
badgeSize.height = fminf(badgeSize.height, size.height);
CGFloat x = roundf((size.width - badgeSize.width) / 2.0f);
CGRect badgeRect = CGRectMake(x, roundf((size.height - badgeSize.height) / 2.0f), badgeSize.width, badgeSize.height);
CGContextAddEllipseInRect(ctx, rect);
CGContextSetFillColor(ctx, CGColorGetComponents([_badgeColor CGColor]));
CGContextFillPath(ctx);
[_textLabel drawTextInRect:badgeRect];
}
效果很好。我可以看到徽章查看我添加它的确切位置。如果我切换标签,没有任何影响。
所有tabControllers的视图控制器都是UINavigationControllers。我有一个用例,其中一个选项卡的UINavigationController的最顶级UIViewController不应该显示tabBar,所以我自然设置
controller.hidesBottomBarWhenPushed = YES
在按下navigationController堆栈之前。这成功地抑制了tabBar,但我的自定义UIViews仍然存在。为了解决这个问题,我将自定义UITabBarController设为UINavigationControllerDelegate。这允许我在导航推送和弹出时手动隐藏和显示这些自定义UIView。
我是这样做的:
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController
animated:(BOOL)animated
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
效果很好....仅适用于iOS6。
在iOS7上,自定义UITabBarController在从hidesBottomBarWhenPushed设置为YES的UIViewController弹出后不会显示自定义UIViews。如果hidesBottomBarWhenPushed设置为NO,则UIViews将继续显示。
事实上,我完全删除了UINavigationControllerDelegate,并且发生了奇怪的事情,当我在UINavigationController上向下钻取堆栈(使用hidesBottomBarWhenPushed = YES)时,tabBar被隐藏,但是我添加的自定义UIViews仍然存在(我预期的东西) )。但是当我从那里回来时(这是最奇怪的部分),我回到选项卡的顶级控制器(应显示tabBar),tabBar可见(预期),但自定义UIViews消失。点击退回,它们出现,按回来,它们就会消失。
此行为仅发生在iOS7上。在显示带有hidesBottomBarWhenPushed = YES的UIViewController,然后返回到带有hidesBottomBarWhenPushed = NO的UIViewController后,UITabBar会发生什么变化?
答案 0 :(得分:1)
每当UITabBarController将自己的视图重新添加到其层次结构时,您的自定义徽章视图就会隐藏在UITabBarController自己的视图后面。
要始终将自定义徽章视图保持在最顶层,您可以在自定义徽章视图上覆盖drawRect
并致电[self.superview bringSubviewToFront:self];
- (void)drawRect:(CGRect)rect {
[self.superview bringSubviewToFront:self];
// Other code...
}