Настраиваемое подклассное представление коллекции - вызывается предпочитаемый элемент FocusEnvironments, но представление не сфокусировано - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь реализовать "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 ]

0 голосов
/ 31 августа 2018

Наконец, мне нужно было установить restoreFocusAfterTransition = false для контроллера вида. Это как-то билось с этим.

0 голосов
/ 30 августа 2018

preferredFocusEnvironments только позволит вам указать, что ваш collectionView, в целом, является предпочтительной средой фокусировки, но вы не можете использовать его для предпочтения отдельных ячеек.

Для этого вы можете реализовать метод indexPathForPreferredFocusedView из UICollectionViewDelegate

Дополнительную информацию по этой другой проблеме вы можете найти в аналогичном вопросе и рабочем примере в качестве ответа: indexPathForPreferredFocusedView не вызывается

...