Настраиваемое подклассное представление коллекции - вызывается предпочитаемый элемент FocusEnvironments, но представление не сфокусировано
Я пытаюсь реализовать "RemembermbersLastFocusedIndexPath" для пользовательского представления коллекции. В документации Apple сказано:
"Если вы создаете подкласс UICollectionView, вы также можете реализовать то же поведение, переопределив свойство предпочитаемое значение FocusEnvironments, которое определяется протоколом UIFocusEnvironment и принимается всеми представлениями".
class MyCollectionView: UICollectionView {
open override var preferredFocusEnvironments: [UIFocusEnvironment] {
let sortedVisibleIndexPaths = indexPathsForVisibleItems.sorted(by: {$0 < $1})
if let visibleIndexPath = sortedVisibleIndexPaths[safe: 1] {
if let cell = cellForItem(at: visibleIndexPath) {
return [cell]
}
}
return []
}
open override func didUpdateFocus(in context: UIFocusUpdateContext, with coordinator: UIFocusAnimationCoordinator) {
super.didUpdateFocus(in: context, with: coordinator)
LogUtils.logger.error("!")
}
}
Вызывается Предпочитаемая Фокусная среда, но когда я проверяю "context.nextFocusedItem" в "didUpdateFocus", это другая ячейка, и фокус перемещается случайным образом. Кто-нибудь знает, где могут быть проблемы? Я не могу разобраться.
2 ответа
preferredFocusEnvironments
позволит вам только указать, что ваш collectionView, в целом, является предпочтительной средой фокусировки, но вы не можете использовать ее для предпочтения отдельных ячеек.
Для этого вы можете реализовать метод indexPathForPreferredFocusedView
из UICollectionViewDelegate
Вы можете найти больше информации по этой другой проблеме с похожим вопросом и рабочим примером в качестве ответа: indexPathForPreferredFocusedView не вызывается
Наконец, я должен был установить restoresFocusAfterTransition = false для контроллера представления. Это как-то билось с этим.