我使用带有部分的标准UICollectionView。我的单元格像网格一样布置。如果用户使用Apple TV Remote 移动焦点,则所选方向上的下一个单元格将正确对焦。但是,如果网格中存在“间隙”,则默认焦点引擎会跳过各个部分。这样做是为了将一个单元格聚焦,该单元格可能相隔数个部分,但位于同一列中。

简单的例子:
共有3个部分。第一部分有3个单元格。第二个单元有2个单元格,最后一个单元又有3个单元格。见下图:

uicollectionview - UICollectionView的自定义焦点引擎行为-LMLPHP

如果绿色单元格已聚焦并且用户触摸向下方向,则黄色单元格将获得聚焦,并且聚焦引擎将跳过第二部分。

我想强制所有部分都不能跳过。因此,我不想聚焦黄色单元格,而是聚焦蓝色单元格。

我了解到Apple TV Focus引擎在内部像网格系统一样工作,并且所描述的行为是默认行为。要允许其他运动(例如对角线运动),我们需要通过放置不可见的UIFocusGuide来帮助聚焦引擎,该preferredFocusedView可以将聚焦引擎重定向到UICollectionView

因此,在下图中,在UIFocusGuide节的空白区域中放置了一个不可见的红色聚焦向导,该向导将向下聚焦重定向到所需的蓝色单元格。从理论上讲,我认为这将是完美的解决方案。

uicollectionview - UICollectionView的自定义焦点引擎行为-LMLPHP

但是,如何将UICollectionView添加到UIFocusGuide节的所有空白区域?我已经尝试了几件事,但是没有任何效果。也许将其添加为装饰 View ,但这似乎是错误的。或作为其他单元格,但这会破坏数据层并且约束 anchor 不起作用。

有谁知道如何添加UICollectionView到ojit_code吗?

最佳答案

实现目标的两种方法。至少我尝试过并使其起作用。 =)。可能还有其他方法。

1:

实现目标的最简单方法是使用包含水平集合 View 的单元格添加垂直集合 View 。每个水平集合都是您的部分。

确保将以下代码添加到垂直集合 View :

func collectionView(collectionView: UICollectionView, canFocusItemAtIndexPath indexPath: NSIndexPath) -> Bool {
    return false
}

2:

如果您想使用UIFocusGuide,我认为添加焦点指南的一个好地方是节标题。确保您在节标题中有焦点指南,并在切换到每个节时更新preferredFocusedView。在我的情况下,我在离开该部分时分配每个部分的第一个单元格。

关于uicollectionview - UICollectionView的自定义焦点引擎行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34120558/

10-15 22:54