仅当iOS7上的hidesBottomBarWhenPushed设置为YES时,UITabBarController子视图才会消失

时间:2013-11-19 01:58:02

标签: ios ios7 uitabbarcontroller

我创建了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会发生什么变化?

1 个答案:

答案 0 :(得分:1)

每当UITabBarController将自己的视图重新添加到其层次结构时,您的自定义徽章视图就会隐藏在UITabBarController自己的视图后面。

要始终将自定义徽章视图保持在最顶层,您可以在自定义徽章视图上覆盖drawRect并致电[self.superview bringSubviewToFront:self];

- (void)drawRect:(CGRect)rect {
  [self.superview bringSubviewToFront:self];

  // Other code...
}