gpt4 book ai didi

uicollectionview - 如何在 Collection View 中手动选择下一个聚焦索引路径

转载 作者:行者123 更新时间:2023-12-05 06:56:28 25 4
gpt4 key购买 nike

如何在 tvOS 上为我的 Collection View 手动决定下一个聚焦索引路径?

我的用例是我有一个 Collection View ,其中包含向各个方向滚动的动态单元格,有时当一个部分中的单元格跨越下一个部分中的多个单元格时,我希望能够手动决定获取哪个单元格下一个重点。

默认行为似乎是 Collection View 将选择前一个单元格中间的单元格。

例如,绿色单元格当前处于焦点状态。当我向下导航时, Collection View 想要聚焦红色单元格,但我希望接下来聚焦蓝色单元格。

enter image description here

我最初的想法是实现 collectionView(_:shouldUpdateFocusIn:) 委托(delegate)函数,并返回 false + 触发焦点更新,当 Collection View 选择“错误的”索引路径。

但是,由于某些原因,当我从它返回 false 时,shouldUpdateFocusIn 会被调用多次,并导致明显的滞后。

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:) 中做同样的事情,但在这种情况下,我们只在焦点已经移动到“错误的”单元格后更新焦点,因此对于用户来说,焦点从错误的单元格移动到正确的单元格变得很明显。

也不理想。

我正在使用我自己的 UICollectionViewLayoutUICollectionView 的子类,但我没有看到任何可以重写的内容以手动决定要关注的索引路径在调用 shouldUpdateFocusIn 之前向上/向下/向左/向右导航时的下一步。

有什么办法可以实现吗?

最佳答案

一种可能是使用 collectionView(_ collectionView:, canFocusItemAt:) 让您的 collectionView 知道给定的 indexPath 是否可以接收焦点。

您可以在下面找到此概念的简单实现。您需要根据需要调整其中的数学。

func collectionView(_ collectionView: UICollectionView, canFocusItemAt indexPath: IndexPath) -> Bool {
guard let currentlyFocusedCellLayoutAttributes = collectionView.layoutAttributesForItem(at: focusedIndexPath) else { return false }
guard let cellAtGivenIndexPathLayoutAttributes = collectionView.layoutAttributesForItem(at: indexPath) else { return false }

let currentlyFocusedCellOriginX = currentlyFocusedCellLayoutAttributes.frame.origin.x
let currentlyFocusedCellOriginY = currentlyFocusedCellLayoutAttributes.frame.origin.y
let currentlyFocusedCellWidth = currentlyFocusedCellLayoutAttributes.frame.width

let cellAtGivenIndexPathOriginX = cellAtGivenIndexPathLayoutAttributes.frame.origin.x
let cellAtGivenIndexPathOriginY = cellAtGivenIndexPathLayoutAttributes.frame.origin.y
let cellAtGivenIndexPathWidth = cellAtGivenIndexPathLayoutAttributes.frame.width

let offsetX = collectionView.contentOffset.x

// Scrolling horizontally is always allowed
if currentlyFocusedCellOriginY == cellAtGivenIndexPathOriginY {
return true
}

// Scrolling vertically is only allowed to the first cell (blue cell in the screenshot)
if cellAtGivenIndexPathOriginX <= offsetX {
return true
}

return false
}

关于uicollectionview - 如何在 Collection View 中手动选择下一个聚焦索引路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65126268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com