我正在尝试使用UICollectionView
实现“无限滚动”。
我是通过缓存this tutorial
中的数据数组来实现的然后按以下方式实施didEndDisplayingCell
UICollectionViewDelegate
:
- (void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath{
if (self.galleryArray.count > 0) {
NSIndexPath *newIndexPath = indexPath;
if (self.specialHeaderView.bannerView.scrollDirection == left) {
newIndexPath = [NSIndexPath indexPathForItem:indexPath.row - 1 inSection:indexPath.section];
} else if (self.specialHeaderView.bannerView.scrollDirection == right) {
newIndexPath = [NSIndexPath indexPathForItem:indexPath.row + 1 inSection:indexPath.section];
}
if (newIndexPath.row == (self.galleryArray.count - 1)) {
// user is scrolling to the right from the last item to the 'fake' item 1.
// reposition offset to show the 'real' item 1 at the left-hand end of the collection view
newIndexPath = [NSIndexPath indexPathForItem:1 inSection:indexPath.section];
[self.bannerCollectionView scrollToItemAtIndexPath:newIndexPath atScrollPosition:UICollectionViewScrollPositionLeft animated:NO];
return;
}
// if (scrollView.contentOffset.x == self.collectionView.frame.size.width) {
if (newIndexPath.row == 0) {
// user is scrolling to the left from the first item to the fake 'item N'.
// reposition offset to show the 'real' item N at the right end end of the collection view
newIndexPath = [NSIndexPath indexPathForItem:([self.galleryArray count] -2) inSection:indexPath.section];
[self.bannerCollectionView scrollToItemAtIndexPath:newIndexPath atScrollPosition:UICollectionViewScrollPositionLeft animated:NO];
}
}
}
问题是,每当调用didEndDisplayingCell
方法并且集合视图通过它的委托CellForItemAtIndexPath
方法请求单元格时,单元格就会隐藏回来。
以下是我的CellForItemAtIndexPath
实施:
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
SpecialBannerCell *specialBannerCell = (SpecialBannerCell *)[collectionView dequeueReusableCellWithReuseIdentifier:GalleryCellIdentifier forIndexPath:indexPath];
if (specialBannerCell.hidden) {
}
Benefit *benefit = [self.galleryArray objectAtIndex:indexPath.row];
[specialBannerCell.imageBanner setImageWithURL:[NSURL URLWithString:benefit.imageIphoneUrl] placeholderImage:[UIImage imageNamed:@"photo_loader"]];
return specialBannerCell;
}
我在这里做错了什么?
答案 0 :(得分:0)
所以我不确定为什么,但是当我使用UIScrollViewDelegate方法而不是didEndDisplayingCell方法时,单元格不再被隐藏,一切都很完美。
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
if (self.galleryArray.count > 0) {
NSIndexPath *indexPath = self.currentIndexPath;
NSIndexPath *newIndexPath = indexPath;
if (newIndexPath.row == (self.galleryArray.count - 1)) {
// user is scrolling to the right from the last item to the 'fake' item 1.
// reposition offset to show the 'real' item 1 at the left-hand end of the collection view
newIndexPath = [NSIndexPath indexPathForItem:1 inSection:indexPath.section];
self.currentIndexPath = newIndexPath;
[self.bannerCollectionView scrollToItemAtIndexPath:newIndexPath atScrollPosition:UICollectionViewScrollPositionLeft animated:NO];
return;
}
if (newIndexPath.row == 0) {
// user is scrolling to the left from the first item to the fake 'item N'.
// reposition offset to show the 'real' item N at the right end end of the collection view
newIndexPath = [NSIndexPath indexPathForItem:([self.galleryArray count] -2) inSection:indexPath.section];
self.currentIndexPath = newIndexPath;
[self.bannerCollectionView scrollToItemAtIndexPath:newIndexPath atScrollPosition:UICollectionViewScrollPositionLeft animated:NO];
}
}
}