原理很簡單驹尼,就是在UICollectionViewCell上面放一個UIScrollView填抬,在UIScrollView放上三個UIImageView实檀,默認(rèn)的展示的是中間的UIImageView读规,當(dāng)用戶劃到下一張圖片的臨界點時候,偷偷的切換回中間的UIImageView展示杉允,但是UIImage卻全部換掉了邑贴,也就是說用戶永遠(yuǎn)看到的是中間的UIImageView限府,只是內(nèi)容不同而已。
步驟一
xib創(chuàng)建UIScrollView
在xib文件中拖入一個UIScrollView痢缎,設(shè)置pageEnable為YES,添加top,leading,bottom,trailing四個約束世澜。這一步是為了確定scrollView的frame独旷。
-
我們再拉一個UIView到scrollView上(注意:這個view很重要,她是用于確定scrollView的contentSize的),并對其上下左右進行約束,約束完你會發(fā)現(xiàn),約束報錯,scrollView的contentSize并不能確定!
-
約束完發(fā)現(xiàn)出錯了,不要著急寥裂,接著我們需要確定一下嵌洼, 我們是需要水平方向的滾動還是豎直方向的滾動,或者水平方向和豎直方向都需要滾動封恰。
1.水平方向和豎直方向都需要滾動的話麻养, 不用添加
2.水平方向滾動或者豎直方向滾動需要添加一個約束:
-
我們這里需要水平方向滾動:
-
然后再添加一個寬度,設(shè)置contentsize诺舔,將這個寬度設(shè)置為屬性鳖昌,在代碼中設(shè)置其大小。
步驟二
在view2上面添加三個UIImageView低飒,設(shè)置其寬度许昨,給中間的UIImageView添加手勢,響應(yīng)點擊事件
步驟三
代碼控制滾動褥赊,設(shè)置計時器
-
設(shè)置數(shù)據(jù)源
- (void)setDataArray:(NSArray *)dataArray
{
_dataArray = dataArray;
if ([dataArray count] == 0) {
NSLog(@"cycleImageViewConfig:images is empty!");
return;
}
if (dataArray.count == 1) {
self.scrollView.scrollEnabled = NO;
}[self changeImageViewWithIndex:self.curIndex]; self.pageControl.numberOfPages = dataArray.count; [self timeSetter]; }
-
設(shè)置定時器
- (void)timeSetter
{
//將定時器放入主進程的RunLoop中
if (!self.timer) {
self.timer = [NSTimer scheduledTimerWithTimeInterval:CH_DEFAULT_DURATION_TIME target:self selector:@selector(timerAction) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
}
}- (void)timerAction{ if (self.dataArray.count <= 1) { return ; } [self.scrollView setContentOffset:CGPointMake(kScreenWidth*2, 0) animated:YES]; [self performSelector:@selector(reloadImage) withObject:nil afterDelay:.35]; } - (void)reloadImage { if (self.dataArray.count == 0) { return; } CGPoint offset = [_scrollView contentOffset]; if (offset.x > kScreenWidth) { // 向右滑動 self.curIndex = CH_CYCLEINDEX_CALCULATE(self.curIndex+1, self.dataArray.count); } else if(offset.x < self.frame.size.width) { // 向左滑動 self.curIndex = CH_CYCLEINDEX_CALCULATE(self.curIndex-1, self.dataArray.count); } [self changeImageViewWithIndex:self.curIndex]; [self.scrollView setContentOffset:CGPointMake(kScreenWidth, 0) animated:NO]; self.pageControl.currentPage = self.curIndex; }
-
改變輪播的圖片
- (void)changeImageViewWithIndex:(NSInteger)index
{
NSString *midString = self.dataArray[CH_CYCLEINDEX_CALCULATE(index, self.dataArray.count)];
NSString *leftString = self.dataArray[CH_CYCLEINDEX_CALCULATE(index-1, self.dataArray.count)];
NSString *rightString = self.dataArray[CH_CYCLEINDEX_CALCULATE(index+1, self.dataArray.count)];[self.leftImageView sd_setImageWithURL:[NSURL URLWithString:leftString] placeholderImage:[UIImage imageNamed:@"place_2"]]; [self.midImageVIew sd_setImageWithURL:[NSURL URLWithString:midString] placeholderImage:[UIImage imageNamed:@"place_2"]]; [self.rightImageView sd_setImageWithURL:[NSURL URLWithString:rightString] placeholderImage:[UIImage imageNamed:@"place_2"]]; }
-
ScrollView Delegate
//當(dāng)用戶手動個輪播時 關(guān)閉定時器
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
[self.timer invalidate];
self.timer = nil;
}//當(dāng)用戶手指停止滑動圖片時 啟動定時器
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
[self timeSetter];
}- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { [self reloadImage]; }
(具體看demo)