Как центрировать 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)
    }

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


person xinatanil    schedule 07.10.2015    source источник


Ответы (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)
    }
}
person Daniel Simons    schedule 29.12.2015
comment
У меня это не работает, фокус выбирается за пределами экрана, а представление коллекции не прокручивается. - person franck; 18.08.2016
comment
Этот трюк в некоторой степени работает, но анимация выглядит совершенно иначе, чем обычное взаимодействие между механизмом фокусировки и прокруткой, поэтому мне придется придумать кое-что еще. - person Matt Mc; 05.02.2018

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

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

person Sarreph    schedule 09.10.2015