如何指导曲面 SKNodes 的 tvOS 焦点项目

How to guide tvOS focus items for curved SKNodes

提问人:Aaron 提问时间:6/6/2017 更新时间:7/1/2019 访问量:443

问:

我的 Apple tvOS App 使用 SKNodes 生成一个游戏板,如下所示:

enter image description here

每个形状,用线条分隔,都是一个可聚焦的SKNode(例如,每个彩色楔形由5个SKNode组成,这些SKNode的大小逐渐减小,靠近中心)。

我的问题是焦点引擎没有聚焦下一个焦点项 (SKNode),这感觉就像是合乎逻辑的、最自然的下一个焦点节点。这个问题是因为焦点引擎逻辑是矩形的,而我的 SKNodes 是弯曲的。如下图所示,当从最外层的黄色 SKNode 向下滑动时,试图找出下一个可聚焦的项目时,存在固有的问题:

enter image description here

在上面的示例中,焦点引擎根据节点的边缘推断当前聚焦区域是红色阴影矩形内的区域。由于此逻辑,聚焦矩形与不属于当前聚焦节点的区域重叠,包括第二个黄色 SKNode 的整个宽度。因此,当向下滑动时,对焦引擎会将焦点跳过到第三个(中间)黄色 SKNode。

如何解决这个焦点问题,以便我的 SKNodes 圆形游戏板在垂直和水平方向上都更加自然,而不会显得那么零星?这可能吗?也许使用 UIFocusGuides?

Swift Sprite-Kit tvOS SKNode

评论

0赞 Knight0fDragon 6/6/2017
禁用您不想对焦的精灵,(基本上,如果它不在已经对焦的精灵旁边,那么不要让它对焦
0赞 Confused 6/9/2017
我认为您将不得不放弃使用焦点系统,而是根据当前选择手动解释用户输入。一点乐趣都没有。
0赞 Knight0fDragon 6/13/2017
@Confused,不,他不需要放弃它,他只需要做一些工作来确保每个节点都知道它是邻居。这是 100% 可能的,只是不值得花时间编写所有代码来做出答案。他还可以将切片分成更小的块,以确保没有重叠。
0赞 Aaron 6/13/2017
@Knight0fDragon 你是对的。我对此开了赏金,但后来我决定应用你的建议。我只需要创造性地使用一些坐标逻辑,以确保当前所选节点周围的某些节点是可聚焦的,而其余节点则不是以优雅和廉价的方式。
0赞 Knight0fDragon 6/13/2017
Aaron,只需为每个切片分配一个唯一的索引,并在代码中设置某种规则,例如 slice[3] = [1,2,4,8],这意味着只有切片 1、2、4 和 8 可以被 3 触及

答:

0赞 Ajinkya 6/30/2019 #1

您必须手动处理焦点。使用下面列出的方法检查上下文中的下一个焦点视图。

func shouldUpdateFocus(in context: UIFocusUpdateContext) -> Bool

在此方法中,您将获得焦点朝向方向 (UIFocusHeading)。截获所需的方向,并将所需的下一个焦点视图保存在某个属性中。通过调用以下方法手动更新焦点

setNeedsFocusUpdate()

updateFocusIfNeeded()

这将触发以下

preferredFocusEnvironments: [UIFocusEnvironment] { get }

在此检查已保存的实例,并返回相同的实例。这将帮助您根据自己的要求手动处理焦点。