如何暂时停用tvOS UITabBarController

时间:2015-11-28 04:18:41

标签: uitabbarcontroller tvos

这是我的情况:

我有一个tvOS应用程序,其中基本导航是一个UITabBarController。从UITabBarController引用的每个根视图控制器都是一个UINavigationController,然后处理将ViewControllers推送到堆栈。当一个特定的ViewController(包含一个CollectionView)处于活动状态时,我需要阻止默认的tvOS UITabBarController才能获得焦点。

我试图在ViewWillAppear上手动隐藏TabBar,对TabBar进行子类化并覆盖首选焦点视图。在大多数情况下,在TabBar中停用焦点会导致其activeViewController中的焦点停用。目前我的解决方案是覆盖我的ViewController中的“shouldUpdateFocusInContext”委托方法,并防止任何焦点到不是UICollectionViews的视图。这适用于这一个案例,但显然是一个次优的黑客解决方案。

override func shouldUpdateFocusInContext(context: UIFocusUpdateContext) -> Bool {
    guard let nextFocusView = context.nextFocusedView else {return false}

    if nextFocusView.isKindOfClass(UICollectionViewCell.classForCoder()) {
        return true
    } else {
        return false
    }
}

当用户在tvOS遥控器上滑动时,任何人都有更好的想法如何暂时阻止UITabBarController的TabBar显示?

1 个答案:

答案 0 :(得分:1)

要防止在用户滑动时显示UITabBarController的TabBar,请使用focusHeading:

-(BOOL)shouldUpdateFocusInContext:(UIFocusUpdateContext *)context
{
    BOOL result = [super shouldUpdateFocusInContext:context];
    if (context.focusHeading == UIFocusHeadingUp)
        return NO;
    return result;
}

这对我来说特别有用,因为我的ViewController没有任何可聚焦的视图。它只有一个页面上的scrollView,它使用panGestureRecognizer.allowedTouchTypes来捕获滑动,我无法使用nextFocusedView

修改

我还发现使用-(void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item来跟踪选择哪个标签很有用,所以我只能为某些标签返回NO。