0

我正在构建一个像照片这样的应用程序,您可以在其中滚动浏览照片的缩略图UICollectionView您可以点击其中一张以全屏查看该照片,然后滑动以在照片之间移动。我正在努力添加对键盘导航的支持,以便您可以使用箭头键选择照片,点击空格键全屏查看,使用箭头键在全屏照片之间移动,然后点击空格键将其关闭。这在照片应用程序中效果很好,但是在我的应用程序中,当您关闭全屏视图控制器时,基础视图控制器中的焦点不会更新到您刚刚关闭的照片的索引路径 - 它显然只知道索引最后一次聚焦在该视图控制器中的路径,即在按下空格之前聚焦的路径。当全屏视图控制器被解除时,我似乎需要手动将焦点移动到可能不同的索引路径。你如何做到这一点?

为了启用焦点,我将这些设置在UICollectionViewController

collectionView.allowsFocus = true
collectionView.allowsFocusDuringEditing = true
collectionView.remembersLastFocusedIndexPath = true
restoresFocusAfterTransition = true

我已经尝试了以下方法,但即使我设置了remembersLastFocusedIndexPath和,焦点也没有移动restoresFocusAfterTransition到该单元格false

cell.focusGroupPriority = .currentlyFocused
cell.setNeedsFocusUpdate()
cell.updateFocusIfNeeded()
cell.becomeFirstResponder()
4

1 回答 1

0

如果已经存在焦点索引路径,则可以更改焦点索引路径。

为此,请实现集合视图委托方法indexPathForPreferredFocusedView(in:)以返回您想要聚焦的索引路径。当您想更改焦点时,调用collectionView.setNeedsFocusUpdate()该函数,系统将调用该函数,让您有机会指定焦点的索引路径。注意 iOS 现在将要求您的应用程序告诉它最初关注哪个索引路径以及焦点状态发生变化。您可以返回 nil 让系统决定关注哪个。

请注意,您不能设置collectionView.remembersLastFocusedIndexPath为,true否则这将不起作用。要拥有该功能,您需要手动跟踪最后一个焦点索引路径,collectionView(_:didUpdateFocusIn:with:)并在indexPathForPreferredFocusedView(in:).

func indexPathForPreferredFocusedView(in collectionView: UICollectionView) -> IndexPath? {
    return lastFocusedIndexPath
}

func collectionView(_ collectionView: UICollectionView, didUpdateFocusIn context: UICollectionViewFocusUpdateContext, with coordinator: UIFocusAnimationCoordinator) {
    lastFocusedIndexPath = context.nextFocusedIndexPath
}

private func moveFocus(to indexPath: IndexPath) {
    lastFocusedIndexPath = indexPath
    collectionView.setNeedsFocusUpdate()
    //collectionView.updateFocusIfNeeded() //can update it now if you need it to
}
于 2021-12-27T03:13:58.000 回答