首页 > 代码库 > 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 幻灯片的自动循环滚动
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。