Apple TV强力关注另一种观点

时间:2016-10-10 08:31:00

标签: ios objective-c apple-tv

我正在研究Apple TV项目。该项目包含标签栏视图控制器,通常在向上滑动时会出现标签栏,向下滑动时会隐藏。但是现在我反转了这种行为,我想在向上滑动时强制关注另一个视图(通常专注于标签栏)。有办法吗?谢谢。

2 个答案:

答案 0 :(得分:0)

我之前在UITabbarController的焦点上遇到了同样的问题,我在Apple支持中找到了解决方案

  

因为UIViewController符合UIFocusEnvironment,自定义视图   您应用中的控制器可以覆盖UIFocusEnvironment委托   实现自定义焦点行为的方法。定制视图控制器   可以:

     

重写preferredFocusedView以指定焦点应该从哪里开始   默认情况下。覆盖shouldUpdateFocusInContext:来定义焦点的位置   被允许移动。覆盖   didUpdateFocusInContext:withAnimationCoordinator:响应焦点   发生更新并更新应用程序的内部状态。您的   视图控制器还可以请求焦点引擎重置焦点   callsetNeedsFocusUpdate当前的preferredFocusedView。注意   调用setNeedsFocusUpdate只对视图有效   controller包含当前关注的视图。

有关详细信息,请查看此链接 https://developer.apple.com/library/content/documentation/General/Conceptual/AppleTV_PG/WorkingwiththeAppleTVRemote.html#//apple_ref/doc/uid/TP40015241-CH5-SW14

答案 1 :(得分:0)

在您的UIViewController中,覆盖 shouldUpdateFocusInContext 。如果检测到选项卡栏中有向上导航,请返回false以防止焦点到达选项卡栏中。然后结合使用 preferredFocusEnvironments + setNeedsFocusUpdate 将焦点重定向到其他位置:

override func shouldUpdateFocus(in context: UIFocusUpdateContext) -> Bool {
  if let nextView: UIView = context.nextFocusedView{
    if ( context.focusHeading == .up &&  nextView.isDescendant(of: tabBar) ){
      changeFocusTo(myView)
      return false
    }
  }
}

internal var viewToFocus: UIView?
func changeFocusTo(_ view:UIView? ){
    viewToFocus = view
    setNeedsFocusUpdate()
}

override var preferredFocusEnvironments: [UIFocusEnvironment]{
    return viewToFocus != nil ? [viewToFocus!] : super.preferredFocusEnvironments
}

这是自定义焦点更新的通常有用的技术。另一种技术是使用 UIFocusGuide 。您可以在标签栏下方插入焦点指南,或在标签栏周围用焦点指南重定向焦点。尽管聚焦指南对于简单的案例很有用,但是使用我正在描述的技术,我通常会获得更好的结果。