2015-11-24 5 views
0

У меня есть подкласс UICollectionViewController, который вложен внутри UINavigationController. Коллекция содержит несколько ячеек (в настоящее время, 3), и каждая ячейка имеет размер как полный экран.UICollectionView не прокручивается после его инициализации

Когда все это будет показано, вид коллекции Initally прокручивается к определенной ячейке (которая работает безупречно для каждой ячейки):

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 
    if let path = currentlyPresentedPhotoCellIndexPath { // this is set in the beginning 
     collectionView?.scrollToItemAtIndexPath(path, atScrollPosition: UICollectionViewScrollPosition.CenteredHorizontally, animated: false) 
    } 
} 

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

  • взаимодействия пользователя включена для представления коллекции
  • следующей ячейки (вправо или влево, в зависимости от направления прокрутки) являюсь просил правильно, которую я узнал, проверяя collectionView:cellForItemAtIndexPath:
  • запрашиваемый ImagePath является правильным
  • scrollToItemAtIndexPath... не работает, либо если я пытаюсь вызвать свиток программно после загрузки все (ничего не происходит)
  • scrollRectToVisible... не делает ни
  • установки collectionView?.contentInset = UIEdgeInsetsZero до программных попыток прокрутки иметь место ничего не меняет
  • размера содержания представления коллекции является 3072x768 (= 3 экрана, то есть 3 клетки)

Какой пуля точек здесь нет?

+1

сделал у попробовать? http://stackoverflow.com/questions/33737839/change-scrolling-position-of-collection-view-when-view-is-currently-not-visible/33738415#33738415 –

+0

Ну, свитки проходят после кода, который Я опубликовал сообщение успешно выполнен. Поэтому все уже проложено. Кроме того, автоматическая прокрутка (на основе жестов пользователей, т. Е. Не путем ее запуска программно) должна произойти в любом случае. – Bastian

+0

@ Mr.T Я пересматриваю свой комментарий: не совсем решение для моей проблемы, но определенно указатель на правильное направление! – Bastian

ответ

1

Хотя сообщение не предназначалось точно для корень моей проблемы, это заставило меня задуматься над кодом, который я опубликовал. Если вы посмотрите на это, вы увидите, что в основном это говорит: Всякий раз, когда виды должны быть оформлены, прокрутите до ячейки в позиции в настоящее времяPresentedPhotoCellIndexPath. Однако, и вы не можете видеть без какого-либо контекста, эта переменная устанавливается только один раз, когда весь контроллер инициализируется. Таким образом, при попытке прокрутки макет изменяется, контроллер затем возвращается к исходной ячейке, и похоже, что ничего не происходит вообще.

Чтобы изменить это, вам просто нужно принудительно выполнить одиночный свиток, например. при этом:

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 
    if let path = currentlyPresentedPhotoCellIndexPath { // only once possible 
     collectionView?.scrollToItemAtIndexPath(path, atScrollPosition: UICollectionViewScrollPosition.CenteredHorizontally, animated: false) 
     currentlyPresentedPhotoCellIndexPath = nil // because of this line 
     // "initiallyPresentedPhotoCellIndexPath" would probably a better name 
    } 
} 

Большое спасибо Mr.T!

Смежные вопросы