我正在研究Apple TV项目。该项目包含标签栏视图控制器,通常在向上滑动时会出现标签栏,向下滑动时会隐藏。但是现在我反转了这种行为,我想在向上滑动时强制关注另一个视图(通常专注于标签栏)。有办法吗?谢谢。
答案 0 :(得分:0)
我之前在UITabbarController的焦点上遇到了同样的问题,我在Apple支持中找到了解决方案
因为UIViewController符合UIFocusEnvironment,自定义视图 您应用中的控制器可以覆盖UIFocusEnvironment委托 实现自定义焦点行为的方法。定制视图控制器 可以:
重写preferredFocusedView以指定焦点应该从哪里开始 默认情况下。覆盖shouldUpdateFocusInContext:来定义焦点的位置 被允许移动。覆盖 didUpdateFocusInContext:withAnimationCoordinator:响应焦点 发生更新并更新应用程序的内部状态。您的 视图控制器还可以请求焦点引擎重置焦点 callsetNeedsFocusUpdate当前的preferredFocusedView。注意 调用setNeedsFocusUpdate只对视图有效 controller包含当前关注的视图。
答案 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 。您可以在标签栏下方插入焦点指南,或在标签栏周围用焦点指南重定向焦点。尽管聚焦指南对于简单的案例很有用,但是使用我正在描述的技术,我通常会获得更好的结果。