如何暂时停用 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