如何暂时停用 tvOS UITabBarController

Posted

技术标签:

【中文标题】如何暂时停用 tvOS UITabBarController【英文标题】:How can I temporarily deactivate tvOS UITabBarController 【发布时间】:2015-11-28 04:18:40 【问题描述】:

这是我的情况:

我有一个 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】:

为了防止UITabBarController的TabBar在用户向上滑动时显示,使用focusHeading:

-(BOOL)shouldUpdateFocusInContext:(UIFocusUpdateContext *)context

    BOOL result = [super shouldUpdateFocusInContext:context];
    if (context.focusHeading == UIFocusHeadingUp)
        return NO;
    return result;

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

编辑

我还发现使用 -(void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item 来跟踪选择了哪个选项卡很有用,这样我就可以只对某些选项卡返回 NO。

【讨论】:

以上是关于如何暂时停用 tvOS UITabBarController的主要内容,如果未能解决你的问题,请参考以下文章

我可以在我的 appdelegate applicationDidFinishLaunching 中插入 UINavigationController 并在我的笔尖实例化的 UITabBarContr

您停用了 FxCop 中的哪条规则?

如何上传通用 tvOS 应用程序?

如何在 tvOS 中打开 GameCenter

如何在 tvOS 的同一视图中显示 UISearchController?

Lucene的Smart CN实现分词停用词扩展词