UICollectionView是一個很棒的控件,今天用collectionview實現了一下輪播圖控件,主要記錄一下思路和一些比較小技巧吧,以便日后翻閱:
首先,基本思路是利用collectionview的本身的一些特性簡化我們,我們可以在在每一個cell上添加一個imgeview,將要輪播的圖片設置在每一個cell上,可以說基本功能就完成了,因為collectionview類似于uitableview,可以自由滾動,而且可以循環利用,到此一個基本的輪播圖控件就完成了。上面這些不再詳述,大家都懂,主要是說一下我們標題所示的無限輪播
其實,我的實現方法是利用人的視覺差:
1、首先,根據拿到的圖片數組imgs
,重新構造一個圖片數組carouselImages,新數組的結構是carouselImages = [imgs[lastObject],..imgs的所有元素...,imgs[0]]
,就是在imgs數組的最前面添加imgs的最后一個元素,在最后面添加imgs的第一個元素,構成新數組carouselImages
2、然后利用新數組carouselImages來作為數據實現基本輪播功能
3、特殊處理
3.1讓collectionview默認滾動到row = 1(其實就是我們要輪播的第一張圖片)可以在layoutsubviews中實現
//默認滾動到第一張圖片
if (self.loop && self.carouselView.contentOffset.x == 0)
{
NSIndexPath *indexPath = [NSIndexPath indexPathForItem:1 inSection:0];
[self.carouselView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionNone animated:NO];
self.currentIndex = 1;
}
3.2在- (void)scrollViewDidScroll:(UIScrollView *)scrollView
方法中在滾動到最后一張圖片時,繼續滾向后動跳到第一張,在當滾動到第一張圖片時,繼續向前滾動跳到最后一張,而且不能有動畫
。因為在前面我們重新構造的新數組,當滾動到最后一個圖片繼續滾動的時候,繼續滾動就會滾動出新添加的第一張圖片,此時,我們直接讓collectionview滾動到第一張圖片所在的cell,而且不能帶動畫,此時,圖片沒有變,但是collectionview已經重新滾動到第一個cell,由于沒有動畫,我們基本感覺不出來collectionview的滾動,這樣就很自然的從最后一個cell滾動到第一個cell,從而實現了循環,反向滾動思路一樣,利用在最前面添加的數組元素即可。
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if (self.loop)
{
CGFloat width = self.frame.size.width;
NSInteger index = scrollView.contentOffset.x / width;
//當滾動到最后一張圖片時,繼續滾向后動跳到第一張
if (index == self.imgs.count + 1)
{
self.currentIndex = 1;
NSIndexPath *indexPath = [NSIndexPath indexPathForItem:self.currentIndex inSection:0];
[self.carouselView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionNone animated:NO];
return;
}
//當滾動到第一張圖片時,繼續向前滾動跳到最后一張
//當且僅當滾過第0張圖片的一半的時候,滾動到最后一張
if (scrollView.contentOffset.x < width * 0.5){
self.currentIndex = self.imgs.count;
NSIndexPath *indexPath = [NSIndexPath indexPathForItem:self.currentIndex inSection:0];
[self.carouselView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionNone animated:NO];
return;
}
}
}