2014-10-13 2 views
0

У нас есть UICollectionView, который заполняет весь экран, чтобы имитировать полноэкранное слайд-шоу фотографий. Данные представления коллекции поддерживаются NSFetchedResultsController. В любой момент времени на экране отображается только одна ячейка коллекции. Существует также повторяемый NSTimer с интервалом в 5 секунд, который запускает метод «gotoNextPage», который вызывает scrollToItemAtIndexPath для следующего выбранного объекта (следующая ячейка UICollectionView, следующая фотография слайд-шоу). Это плавный переход вперед. Когда мы дойдем до конца слайд-шоу, мы хотели бы легко продвинуться вперед к первой фотографии и снова начать слайд-шоу. Конечно, когда мы прокручиваемToItemAtIndexPath обратно на первую фотографию, она быстро прокручивается назад (в зависимости от того, сколько у нас было извлеченных объектов). Мы хотим, чтобы передняя анимация была последовательной, независимо от того, находитесь ли вы в начале, середине или конце слайд-шоу/UICollectionView.Endless UICollectionView Слайд-шоу + scrollToItemAtIndexPath

У кого-нибудь есть творческий способ решить эту проблему?

Благодаря

ответ

1

Вы могли бы просто позволить индекс путь номер позиции непрерывно увеличивается, и основывают свой cellForItemAtIndexPath и другую таблицу логики на остаток после деления на число фотографий. Таким образом, вы могли бы написать:

NSUInteger photoCount = [[self.fetchedResultsController fetchedObjects] count]; 
NSIndexPath *fetchIndexPath = [NSIndexPath indexPathForItem:(indexPath.item % photoCount) inSection:0]; 
Photo *myPhoto = [self.fetchedResultsController objectAtIndexPath:fetchIndexPath]; 

Аналогичный подход должен работать в других методах DataSource/делегата Tableview/NSFetchedResultsController. EDIT Как вы заметили в своем комментарии, вам нужно будет установить numberOfItemsInSection на очень большое число (NSIntegerMax?).

В качестве альтернативы ... Вы можете изменить ваш cellForItemAtIndexPath так что есть дополнительная клетка, после последней фотографии, которая содержит ту же фотографию, как для строки 0.

Photo *myPhoto 
NSUInteger photoCount = [[self.fetchedResultsController fetchedObjects] count]; 
if (indexPath.item = photoCount) { 
    myPhoto = [self.fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]]; 
} else { 
    myPhoto = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
} 
... configure cell... 

Вы бы изменить numberOfItemsInSection, чтобы вернуть photoCount+1.

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

if (currentItem == photoCount -1) { 
    [self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:photoCount inSection:0] atScrollPosition:<your preference> animated:NO]; 
    [self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0] atScrollPosition:<your preference> animated:YES]; 
} else { 
    [self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:(currentItem+1) inSection:0] atScrollPosition:<your preference> animated:YES]; 
} 
+0

Поэтому мне нужно прокрутить до элемента fetchedObjects.count (первый элемент fetchedObjects) в конце массива. Это означало бы, что метод делегирования разделов (NSUInteger)OfItemsInSection: (NSInteger) должен быть бесконечным, потому что мне нужен scrollToItemAtIndex для анимации вперед каждый раз, когда он достигает конца массива. Мне нужен индекс, который я прокручиваю, чтобы всегда быть (previousIndex + 1). Ключ здесь - анимация вперед по индексу одного. Как это всегда будет вперед с шагом в 1? Как индекс будет увеличиваться на 1 бесконечно до бесконечности? –

+0

Да, вам нужно будет установить numberOfItemsInSection что-то большое - NSIntegerMax должен длиться несколько сотен лет, по 5 с на фотографию. И да, вы всегда будете прокручивать предыдущий индекс +1. Не должно быть никаких проблем с этим - повторное использование ячеек позволит избежать проблем с памятью из-за создания большего количества просмотров. Но у меня есть еще один вариант, который я добавлю к моему ответу. – pbasdf

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