Как отцентрировать UICollectionViewCell, который был сфокусирован?

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

    func collectionView(collectionView: UICollectionView, didUpdateFocusInContext context: UICollectionViewFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) {
        guard collectionView === self.categoryCollectionView else {
            return
        }
        guard let indexPath = context.nextFocusedIndexPath else {
            return
        }

        collectionView.scrollToItemAtIndexPath(indexPath, atScrollPosition: .CenteredHorizontally, animated: true)
    }

Странно то, что представление коллекции игнорирует любую попытку прокрутки в любом месте. В целях тестирования я изменил путь индекса на путь индекса последнего элемента в представлении коллекции, но он работает только тогда, когда представление коллекции появляется впервые.

2 ответа

Хитрость заключается в том, чтобы убедиться, что вы установили UICollectionView scrollEnabled = false.

override func didUpdateFocusInContext(context: UIFocusUpdateContext, 
  withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) {
    if let focusedView = context.nextFocusedView as? UITableViewCell {
      collectionView.scrollEnabled = false
      let indexPath = collectionView.indexPathForCell(focusedView)!
      collectionView.scrollToItemAtIndexPath(indexPath, atScrollPosition: .CenteredHorizontally, animated: true)
    }
}

Я помню, как читал где-то в руководстве AirBnB по Focus Engine, что они несколько освещали это. Их код ( на GitHub) предназначен для класса UIButton, но мы надеемся, что из этого вы можете сделать тезисы для CollectionView.

Надеюсь, это поможет вам найти решение!

Другие вопросы по тегам