无尽的UICollectionView幻灯片+ scrollToItemAtIndexPath

时间:2014-10-13 22:59:24

标签: ios objective-c

我们有一个UICollectionView,可以填满整个屏幕以模仿全屏照片幻灯片。集合视图的数据由NSFetchedResultsController支持。在任何给定时间,屏幕上只显示集合视图的一个单元格。还有一个可重复的NSTimer以5秒的间隔设置,触发方法" gotoNextPage"它将scrollToItemAtIndexPath调用到下一个获取的对象(下一个UICollectionView单元格,下一张幻灯片照片)。这是一个平稳的过渡。当我们到幻灯片结束时,我们希望无缝地前进到第一张照片并再次开始幻灯片放映。当然,当我们将scrollToItemAtIndexPath回滚到第一张照片时,它会快速向后滚动(取决于我们有多少个获取的对象)。无论您是在幻灯片放映/ UICollectionView的开头,中间还是末尾,我们都希望前向动画保持一致。

有没有人有创造性的方法来解决这个问题?

由于

1 个答案:

答案 0 :(得分:1)

您可以让索引路径项目编号连续增加,并在除以照片计数后将剩余的cellForItemAtIndexPath和其他表逻辑基于剩余部分。所以你可以编码:

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

类似的方法应该适用于其他tableView / NSFetchedResultsController数据源/委托方法。 编辑正如您在评论中所说,您必须将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];
}