为Apple TV开发

在上面的示例中,带有黄色突出显示的单元格清楚地指示了选定的产品。 为了获得这种用户体验,开发人员需要系统通知他们焦点更新,这就是焦点引擎起作用的地方。

焦点引擎

最初的重点

启动应用程序或显示新屏幕时,用户需要查看最初聚焦于哪个元素。 默认情况下,焦点引擎会选择屏幕上的第一个可聚焦元素。

在此示例中,聚焦引擎明智地聚焦于集合的第一个元素。

开发人员还可以选择确定哪个元素从重点开始。 例如,如果在显示屏幕时应将“浏览所有产品”按钮对准焦点,则Apple提供了属性preferredFocusEnvironments ,可以重写该属性以返回该按钮。

preferredFocusEnvironmentsUIFocusEnvironment协议的一部分,控制视觉表示的对象符合该协议。 这意味着焦点引擎了解如何向充当焦点环境的组件提供更新,例如UIView或UIViewController 。 另外,由于视觉表示由较小的视觉表示组成,因此进一步暗示焦点环境可以由其他焦点环境组成,例如视图及其子视图,或者视图控制器及其子视图控制器。

聆听焦点更新

在前面的示例中,聚焦的单元格突出显示为黄色。 这可以通过以下方式实现:

这也是UIFocusEnvironment协议的一部分。 只要焦点引擎将焦点放在焦点环境上,它就会将didUpdateFocus消息发送到焦点环境。 此调用将在焦点环境链中传播,直到最终到达更新其视觉表示以表示焦点状态的元素为止。 在第一个产品专注于发布的示例中,我们的自定义单元收到了didUpdateFocus调用,检查了上下文以确保它是聚焦环境,并将其背景色更新为黄色。

didUpdateFocus还用于更新未聚焦元素的视觉表示。 在我们的示例中,当焦点从一种产品转移到另一种产品时,先前选择的产品的单元格将其背景色设置为浅灰色。

调试焦点更新

在开发过程中保持对焦点引擎行为的清晰了解非常重要。 Apple在Xcode中包含一个焦点检查器,使开发人员可以可视化焦点引擎周围的事件。

上图包括以下内容:

  • 先前关注的项目- 带有实线边框的红色框
  • 滑动方向- 带有虚线边框的浅红色框(在先前聚焦的项目内)
  • 下一个重点元素- 带圆形红色边框的紫色框

可以通过在didUpdateFocus覆盖中设置断点,在应用程序中触发焦点更新以及检查上下文参数来访问可视化。

重点指南

由于聚焦引擎只能以严格的垂直或水平方式找到可聚焦的元素,因此在某些情况下,元素可能无法聚焦,因为它不在滑动方向指示的路径之内。 重点指南就是解决方案。 它们本质上用于通过利用其preferredFocusEnvironments属性来重定向焦点更新。

在下面的示例中,集合视图自动将焦点集中在其集合中与焦点单元相邻的单元上。 但是,除非焦点指南拦截了焦点更新,否则集合视图外部不在焦点单元路径中的元素将无法被焦点。 我们放置了一个焦点指南,该指南从“浏览所有产品”按钮的右边缘延伸到集合视图的右边缘。 由于有了这个聚焦指南,按钮才可以从集合中的最后一项聚焦。

焦点指南是不可见的,但仍可以使用焦点检查器看到。

当用户从最后一项向下滑动时,聚焦指南(蓝色框)将获得聚焦。 因为焦点指南的preferredFocusEnvironments设置为“浏览所有产品”按钮,所以它可以按预期重定向焦点。

以下是焦点指南设置的代码:

重要要点

在构建Apple TV应用程序时,值得花一些时间来全面了解焦点引擎的工作方式以及最终用户将如何浏览该应用程序。 让自己穿上鞋子,想象一下如何与应用程序交互。 此外,请确保您的应用是一致的,并且清楚其如何识别重点内容。 这样,在整个应用程序中,用户体验将变得流畅且连贯。