2017-01-26 3 views
4

У меня есть UICollectionView в пределах UIViewController с включенным пейджингом. По какой-то странной причине collectionView.scrollToItem работает, когда направление collectionview равно vertical, но не в направлении horizontal. Это что-то, что я делаю неправильно или это должно произойти?UICollectionView прокрутите до пункта, который не работает с горизонтальным направлением

//Test scrollToItem 
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
    let i = IndexPath(item: 3, section: 0) 
    collectionView.reloadData() 
     collectionView.scrollToItem(at: i, at: .top, animated: true) 
     print("Selected") 
    } 
+0

вы можете установить направление прокрутки из вертикального в горизонтальное положение с помощью 'UICollectionFlowLayout' – Cruz

+0

@SwiftyCruz направление уже установлен в горизонтальном – kye

+0

затем проверить в принципе, ширина вашего CollectionView contentSize больше, чем в CollectionView пределах ширины она должна быть большой для горизонтального scroll – Cruz

ответ

12

В этой части:

collectionView.scrollToItem(at: i, at: .top, animated: true)

Когда направление прокрутки horizontal вам нужно использовать at: left, at: right или at: centeredHorizontally. at: top для vertical направление.

+0

Это имеет смысл, я должен был подумать об этом. Спасибо за вашу помощь. – kye

0

Для прокрутки элемента нет необходимости перезагружать данные. Удалите строку ниже вашего кода и попробуйте.

collectionView.reloadData() 
+0

Я знаю, что был там только для тестирования – kye

2

У меня возникли проблемы с реализацией этого в макете потока с введенным пейджингом на элемент. .centeredHorizontally просто не будет работать для меня, так что я использую свиток Rect и Проверьте, есть ли данные перед прокруткой:

if self.collectionView?.dataSource?.collectionView(self.collectionView!, cellForItemAt: IndexPath(row: 0, section: 0)) != nil { 
     let rect = self.collectionView.layoutAttributesForItem(at: IndexPath(item: data[index], section: 0))?.frame 
     self.collectionView.scrollRectToVisible(rect!, animated: false) 
    } 
+0

, но если 'else'? –

+0

Это работало для меня, когда другие ничего не делали - в моем случае я уже знаю, что желаемая ячейка существует, поэтому мне не нужна проверка if – mwu

0

Swift 3:

Это работает для меня на горизонтальной точки зрения сбора.

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 

//Show 14th row as first row 
self.activityCollectionView?.scrollToItem(at: IndexPath(row: 14, section: 0), at: UICollectionViewScrollPosition.right, animated: true) 
} 

Вы можете выбрать, будет ли нужная ячейка в индексе находиться справа или слева в положении прокрутки.

UICollectionViewScrollPosition.right or UICollectionViewScrollPosition.left. 
Смежные вопросы