【问题标题】:How to guide tvOS focus items for curved SKNodes如何为弯曲的 SKNode 引导 tvOS 焦点项目
【发布时间】:2017-06-06 05:49:08
【问题描述】:

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

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

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

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

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

【问题讨论】:

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

标签: swift sprite-kit tvos sknode


【解决方案1】:

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

func shouldUpdateFocus(in context: UIFocusUpdateContext) -> Bool

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

setNeedsFocusUpdate()

updateFocusIfNeeded()

这会触发下面的

preferredFocusEnvironments: [UIFocusEnvironment] { get }

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 1970-01-01
    • 2016-03-29
    • 2022-06-12
    • 1970-01-01
    相关资源
    最近更新 更多