zoukankan      html  css  js  c++  java
  • 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]-1
    22     [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)turnPage
    2 {
    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)runTimePage
    2 {
    3     int page = self.pageControl.currentPage; // 获取当前的page
    4     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 *)scrollView
    11 {
    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的具体点击事件没有添加,其他的代码应该就是如此,因为这是以前写的效果,最近才想起来写成博客,可能有些遗漏,欢迎提出,进行交流

  • 相关阅读:
    读《大道至简》第一章有感
    jdk和jre的区别
    题解 LA2911
    题解 UVa11461
    题解 UVa10791
    题解 UVa11489
    题解 LA2889
    题解 UVa11609
    题解 UVa11076
    题解 UVa11752
  • 原文地址:https://www.cnblogs.com/anyezhuixing/p/4095588.html
Copyright © 2011-2022 走看看