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