首页 > 代码库 > iOS 幻灯片的自动循环滚动

iOS 幻灯片的自动循环滚动

首先,我说一下思路,自动滚动的实现是通过定时器进行实现的。当然,考虑到我们在定时循环的时候可能有进行手动滑动,所以我们就要根据

pageControl的当前定点进行判断。

而循环滚动是通过对幻灯片中image多加2进行实现的。

假如你幻灯片中有5个元素需要循环:

[0, 1, 2, 3, 4]

那么你在将这四个元素添加到UIScrollView里面的时候,就需要多添加两个,变成这样:

[ 4, 0, 1, 2, 3, 4, 0 ]

然后只需要在scrollViewDidEndDecelerating代理方法里判断offset是第一个和最后一个

int offset = sv.contentOffset.x / 320;

当offset == 0或者等于最后一个的时候,你setContentOffset到相应元素即可

例如,当offset==0,setContentOffset到第四个元素即可,记着animated设为NO。

 

好了,思路讲好了,下面是具体代码

在scrView中添加显示出来的图片,以及在图片上添加点击手势

  • for (int i = 0; i < arrBanner.count; i++) { //-------------------在scrView中添加图片 UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(320*(i + 1), 0, 320, 120)]; NSDictionary *DicBanner = [arrBanner objectAtIndex:i]; self.model = [[BaseJsonModel alloc] initWithDataDic:DicBanner]; NSString *StrBanner = [NSString stringWithFormat:@"http://app2.jzh.cn/%@",_model.Banner_pic]; NSURL *BannerUrl = [NSURL URLWithString:StrBanner];// UIImage *imgBanner = [UIImage imageWithData:[NSData dataWithContentsOfURL:BannerUrl]]; [imgView setImageWithURL:BannerUrl placeholderImage:nil]; [self.scrView addSubview:imgView]; //--------------------在图片上添加手势 imgView.userInteractionEnabled = YES; imgView.tag = 100 +i; UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dissertation:)]; [imgView addGestureRecognizer:tapGesture]; [tapGesture release]; }

 scrView中添加预留的imageView

 1     // 取数组最后一张图片 放在第0页 2     NSDictionary *DicBanLast = [arrBanner objectAtIndex:arrBanner.count-1]; 3     NSString *LastImg = [DicBanLast objectForKey:@"baner_pic"]; 4     NSString *BannerLast = [NSString stringWithFormat:@"http://app2.jzh.cn/%@",LastImg]; 5     NSURL *BannerLastUrl = [NSURL URLWithString:BannerLast]; 6     UIImageView *imageView = [[UIImageView alloc] init]; 7     [imageView setImageWithURL:BannerLastUrl placeholderImage:nil]; 8     NSLog(@"%@",LastImg); 9     imageView.frame = CGRectMake(0, 0, 320, 120); // 添加最后1页在首页 循环10     [self.scrView addSubview:imageView];11     // 取数组第一张图片 放在最后1页12     NSDictionary *DicBanFirst = [arrBanner objectAtIndex:0];13     NSString *FirstImg = [DicBanFirst objectForKey:@"baner_pic"];14     NSString *BannerFirst = [NSString stringWithFormat:@"http://app2.jzh.cn/%@",FirstImg];15     NSURL *BannerFirstUrl = [NSURL URLWithString:BannerFirst];16     imageView = [[UIImageView alloc] init];17     [imageView setImageWithURL:BannerFirstUrl placeholderImage:nil];18     imageView.frame = CGRectMake((320 * (arrBanner.count + 1)) , 0, 320, 120); // 添加第1页在最后 循环19     [self.scrView addSubview:imageView];20     21     [self.scrView setContentSize:CGSizeMake(320 * (arrBanner.count + 2), 120)]; //  +上第1页和第4页  原理:4-[1-2-3-4]-122     [self.scrView setContentOffset:CGPointMake(0, 0)];23     [self.scrView scrollRectToVisible:CGRectMake(320,0,320,120) animated:NO]; // 默认从序号1位置放第1页 ,序号0位置位置放第4页

 

UIPageControl

    self.pageControl.numberOfPages = arrBanner.count;    self.pageControl.currentPage = 0;    [self.pageControl addTarget:self action:@selector(turnPage) forControlEvents:UIControlEventValueChanged];
1 - (void)turnPage2 {3     int page = self.pageControl.currentPage;4     [self.scrView scrollRectToVisible:CGRectMake(320*(page+1),0,320,120) animated:NO];5 }

定时器添加循环事件

1     // 定时器 循环2     [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(runTimePage) userInfo:nil repeats:YES];
1 - (void)runTimePage2 {3     int page = self.pageControl.currentPage; // 获取当前的page4     page++;5     page = page > arrBanner.count-1 ? 0 : page ;6     self.pageControl.currentPage = page;7     [self turnPage];8 }

scrView代理的实现

 1 #pragma  mark - ScrollViewDelegate 2 - (void)scrollViewDidScroll:(UIScrollView *)scrollView 3 { 4     CGFloat pagewidth = self.scrView.frame.size.width; 5     int page = floor((self.scrView.contentOffset.x - pagewidth/(arrBanner.count+2))/pagewidth)+1; 6     page --;  // 默认从第二页开始 7     self.pageControl.currentPage = page; 8 } 9 // 减速停止10 - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView11 {12     CGFloat pagewidth = self.scrView.frame.size.width;13 14     int currentPage = floor((self.scrView.contentOffset.x - pagewidth/ (arrBanner.count+2)) / pagewidth) + 1;15     //    int currentPage_ = (int)self.scrollView.contentOffset.x/320; // 和上面两行效果一样16     //    NSLog(@"currentPage_==%d",currentPage_);17     if (currentPage==0)18     {19         [self.scrView scrollRectToVisible:CGRectMake(320 * arrBanner.count,0,320,120) animated:NO]; // 序号0 最后1页20     }21     else if (currentPage==(arrBanner.count+1))22     {23         [self.scrView scrollRectToVisible:CGRectMake(320,0,320,120) animated:NO]; // 最后+1,循环第1页24     }25 26 }

除了imgview的具体点击事件没有添加,其他的代码应该就是如此,因为这是以前写的效果,最近才想起来写成博客,可能有些遗漏,欢迎提出,进行交流

 

iOS 幻灯片的自动循环滚动