这是我的情况:
我有一个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显示?
答案 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。