zoukankan      html  css  js  c++  java
  • IOS 实现banner循环轮播

      在项目中把banner图片UIImageView一张一张的放入UIScrollView中,通过设置UIScrollView的pagingEnabled属性为YES,则可以做到当用户滑动banner时图片一张一张的显示,但当用户想从第一张图到最后一张图,或者从最后一张图到第一张图的时候就会卡住,简单点的做法就是判断用户swipe的方向,然后让UIScrollView自动滑动到最后一张或者第一张,这样做在动画中又显得不够自然,一下是解决办法

      假设banner图片有3张,在banner的UIScrollView中用以下的方式进行排列

    第三张 第一张 第二张 第三张 第一张

    UIScrollView默认滚动到第二张图片的位置,当用户滑动到第一张时,则UIScrollView自动滚动到第4张去,同理当用户滑动到最后一张时,UIScrollView自动滚动到第二张去,这些滚动都设置动画效果为NO

    代码如下

    h文件

    #import <UIKit/UIKit.h>
    
    @interface ViewController : UIViewController
    
    @property (weak, nonatomic) IBOutlet UIScrollView *mainScroll;
    @property (weak, nonatomic) IBOutlet UIPageControl *pageControl;
    
    @end

    m文件

    #import "ViewController.h"
    
    @interface ViewController ()<UIScrollViewDelegate>
    {
        CGFloat w;
        NSMutableArray *imgArr;
        NSMutableArray *pageArr;
    }
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        w = self.view.frame.size.width;
        //page的个数
        pageArr = [NSMutableArray array];
        for (int i = 1; i <= 3; i++) {
            [pageArr addObject:[NSString stringWithFormat:@"%d.jpg",i]];
        }
        //重新获取imgView的个数,将显示的第最后一张图片放在第一张,而在最后一张放置显示的第一张图片
        imgArr = [NSMutableArray array];
        [imgArr addObject:pageArr[pageArr.count - 1]];
        for (NSString *imgSrc in pageArr) {
            [imgArr addObject:imgSrc];
        }
        [imgArr addObject:pageArr[0]];
        self.mainScroll.contentSize = CGSizeMake(w*imgArr.count, 0);
        //开始塞入图片
        for (int i = 0; i < imgArr.count; i++) {
            NSString *imgSrc = imgArr[i];
            UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(i*w, 0, w, self.mainScroll.frame.size.height)];
            [imgView setImage:[UIImage imageNamed:imgSrc]];
            [self.mainScroll addSubview:imgView];
        }
        self.pageControl.numberOfPages = pageArr.count;
        self.mainScroll.bounces = NO;
        self.mainScroll.pagingEnabled = YES;
        self.mainScroll.showsHorizontalScrollIndicator = NO;
        self.mainScroll.showsVerticalScrollIndicator = NO;
        self.mainScroll.delegate = self;
        //自动将scrollView移动显示的第一张图片处
        [self.mainScroll setContentOffset:CGPointMake(w, 0) animated:NO];
    }
    
    - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
        CGFloat offsetX = scrollView.contentOffset.x;
        int index = offsetX/w;
        if (index == 0) {
            [self.mainScroll setContentOffset:CGPointMake(w*(imgArr.count-2), 0) animated:NO];
            self.pageControl.currentPage = pageArr.count - 1;
        }else if (index == imgArr.count -1){
            [self.mainScroll setContentOffset:CGPointMake(w, 0) animated:NO];
            self.pageControl.currentPage = 0;
        }else{
            self.pageControl.currentPage = index - 1;
        }
        
    }
    
    
    
    @end
  • 相关阅读:
    IE6,IE7,IE8,Firefox 兼容的css hack以及常见兼容性问题
    BAT及各大互联网公司2014前端笔试面试题:HTML/CSS/JAVASCRIPT
    C语言学习
    HDU 3861 The King’s Problem 最小路径覆盖(强连通分量缩点+二分图最大匹配)
    HDU 2089 不要62【解题报告】
    POJ2762 Going from u to v or from v to u? 强连通分量缩点+拓扑排序
    HDU 1754 线段树入门解题报告
    2019/4/22 kmp模板
    2019/4/22 拓扑排序的高效写法. 模板题HDU1285:确定比赛名次
    HDU 2544最短路 【dijkstra 链式前向星+优先队列优化】
  • 原文地址:https://www.cnblogs.com/skyHF/p/4757987.html
Copyright © 2011-2022 走看看