如何在 tvOS 上为我的集合视图手动决定下一个重点索引路径?
我的用例是我有一个集合视图,其中包含向各个方向滚动的动态单元格,有时当一个部分中的一个单元格跨越下一个部分中的多个单元格时,我希望能够手动决定接下来关注哪个单元格。
默认行为似乎是集合视图将选择前一个中间的单元格。
例如,绿色单元格当前处于焦点位置。当我向下导航时,集合视图想要关注红色单元格,但我希望接下来关注蓝色单元格。
我最初的想法是实现collectionView(_:shouldUpdateFocusIn:)
委托功能,并false
在集合视图选择“错误”索引路径时返回+触发焦点更新。
但是,由于某种原因,shouldUpdateFocusIn
当我从它返回时会被调用多次false
并导致明显的滞后。
func collectionView(_ collectionView: UICollectionView, shouldUpdateFocusIn context: UICollectionViewFocusUpdateContext) -> Bool {
if let nextIndexPath = shouldFocusCell(context.focusHeading, (context.previouslyFocusedIndexPath, context.nextFocusedIndexPath)) {
// The collection view did not select the index path of the cell we want to focus next.
// Save the correct index path and trigger a focus update.
lastFocusChange = (lastFocusChange.next, nextIndexPath)
setNeedsFocusUpdate()
// Using updateFocusIfNeeded() results in the following warning:
// WARNING: Calling updateFocusIfNeeded while a focus update is in progress. This call will be ignored.
return false
}
return true
}
下一个想法是在 中做同样的事情collectionView(_:didUpdateFocusIn:with:)
,但在这种情况下,我们只在焦点已经移动到“错误”单元格之后才更新焦点,因此用户可以清楚地看到焦点从错误单元格移动到正确单元格.
也不理想。
我正在使用我自己的 and 子类UICollectionViewLayout
,UICollectionView
但是我没有看到任何我可以覆盖的东西,以便能够手动决定在shouldUpdateFocusIn
调用之前向上/向下/向左/向右导航时接下来要关注的索引路径。
有什么办法可以做到这一点?