Как отцентрировать 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.
Надеюсь, это поможет вам найти решение!