UIScrollView图片循环轮播

来源:互联网 发布:个人收支软件免费 编辑:程序博客网 时间:2024/05/08 04:56

实现无限滚动视图的方法大体上分为俩种,一种是利用collectionView实现无限滚动,因为collectionView本身存在着复用的问题,所以不用担心内存的消耗问题,就是使用的时候代码相对比较多一点,这里着重介绍第二种,也就是UIScrollView的实现方法。

假如我们现在要显示5张图片,最简单的就是我们直接创建5+2个,也就是7个imageView,而我们的存放顺序为,图片5,图片1,图片2,图片3,图片4,图片5,图片1。默认显示第2张(图片1),一直向右滑动到第6张(图片5),再向右滑动显示第7张(图片1)显示完成后,将UIScrollView的contentOffset设置到第2个imageView上(图片1),这时候便可继续向右滑动实现循环的效果;同理,向左滑动时,滑动到第1张(图片5)后,将UIScrollView的contentOffset设置到第6个imageView上(图片5),这样便可以继续向左滑动实现循环效果。

性能优化:
上面的那种方法,需要我们创建n+2个imageView,而这些imageView都需要加载到内存中去,所以还有一种简单的方法来实现,只需要创建三个imageView便可以实现无限循环。

实现原理:
比如有5张图片,创建三个imageView,分别展示图片5,图片1,图片2,默认展示第二张(图片1),向左滑动显示第3张(图片2),显示完成后,将scrollView的contentOffset重新设置到中间图片,并根据引用计数+1,重新刷新图片,三个imageView分别展示为,图片1,图片2,图片3,这时候就相当于图片2在中间,图片3在右边。同理再次向右滑动,显示图片第3张(图片3),显示完成后,再将scrollView的contentOffset重新设置到中间图片上面,并根据引用计数+1,重新刷新图片,三个imageView分别展示为图片2,图片3,图片4,这时候就相当于图片3在中间,图片4在右边,依次下去,便可实现无限循环。

注意点:使用循环播放,要处理好下标越界的问题。处理方法就直接写在代码里。


#import <UIKit/UIKit.h>


@interface SZInfiniteLoopScrollView :UIView

/**需要添加的图片数组*/

@property (strong,nonatomic)NSArray *images;

/**控制水平竖直方向的滚动 默认为水平方向 设置为YES时为竖直方向*/

@property (assign,nonatomic,getter=isInfiniteScrollVertical)BOOL infiniteScrollVertical;

/** 图片切换时间 */

@property(nonatomic,assign)CGFloat time;

@end





#import "SZInfiniteLoopScrollView.h"


/** ImageView的个数 */

static intconst ImageViewCount =3;

@interface SZInfiniteLoopScrollView ()<UIScrollViewDelegate>

/* 页码控制器 */

@property (weaknonatomicreadonlyUIPageControl *pageControl;

@property (weak,nonatomic)UIScrollView *scrollView;

/* 定时器 */

@property (weak,nonatomic)NSTimer *timer;

@end


@implementation SZInfiniteLoopScrollView

//构造方法

- (instancetype)initWithFrame:(CGRect)frame

{

    if (self = [superinitWithFrame:frame]) {  

        //滚动视图

        UIScrollView *scrollView = [[UIScrollViewalloc]init];

        scrollView.showsHorizontalScrollIndicator =NO;

        scrollView.showsVerticalScrollIndicator =NO;

        scrollView.pagingEnabled =YES;

        scrollView.bounces =NO;

        scrollView.delegate =self;

        [selfaddSubview:scrollView];

        _scrollView = scrollView;

        

        //图片控件

        for (int i =0; i<ImageViewCount; i++) {

            UIImageView *imageView = [[UIImageViewalloc]init];

            [scrollView addSubview:imageView];

        }

        

        //页码视图

        UIPageControl *pageControl = [[UIPageControlalloc]init];

        [selfaddSubview:pageControl];

        _pageControl = pageControl;

    }

    returnself;

}


#pragma mark - 布局子控件

- (void)layoutSubviews

{

    [superlayoutSubviews];

    //设置frame

    _scrollView.frame =self.bounds;

    //设置contentSize

    if (self.isInfiniteScrollVertical) {//垂直滚动

        self.scrollView.contentSize = CGSizeMake(0,ImageViewCount *self.bounds.size.height);

    } else {

        self.scrollView.contentSize = CGSizeMake(ImageViewCount *self.bounds.size.width,0);

    }

    

    //摆放imageView

    for (int i =0; i<ImageViewCount; i++) {

        UIImageView *imageView =self.scrollView.subviews[i];

        

        if (self.isInfiniteScrollVertical) {

            imageView.frame =CGRectMake(0, i *self.scrollView.frame.size.height,

            self.scrollView.frame.size.width,self.scrollView.frame.size.height);

        } else {

            imageView.frame =CGRectMake(i *self.scrollView.frame.size.width,0,

            self.scrollView.frame.size.width,self.scrollView.frame.size.height);

        }

    }

    

    // 设置pageControl

    CGFloat pageW =80;

    CGFloat pageH =20;

    CGFloat pageX =self.scrollView.frame.size.width - pageW;

    CGFloat pageY =self.scrollView.frame.size.height - pageH;

    self.pageControl.frame =CGRectMake(pageX, pageY, pageW, pageH);

    

    [selfupdateContent];

}


#pragma mark - setter

- (void)setImages:(NSArray *)images

{

    _images = images;

    //设置页码

    self.pageControl.numberOfPages = images.count;

    self.pageControl.currentPage = 0;

    //设置内容

    [selfupdateContent];

    //开始定时器

    [selfstartTimer];

}


- (void)setTime:(CGFloat)time{

    

    _time = time;

}


#pragma mark - <UIScrollViewDelegate>

- (void)scrollViewDidScroll:(UIScrollView *)scrollView

{

    //计算当前页码(找出当前显示在最中间的imageView

    NSInteger page =0;

    CGFloat minDistance =MAXFLOAT;

    

    for (int i =0; i<ImageViewCount; i++) {

        UIImageView *imageView =self.scrollView.subviews[i];

        CGFloat distance =0;

        if (self.isInfiniteScrollVertical) {

            distance = ABS(imageView.frame.origin.y - scrollView.contentOffset.y);

        } else {

            distance = ABS(imageView.frame.origin.x - scrollView.contentOffset.x);

        }

        

        if (distance < minDistance) {

            minDistance = distance;

            page = imageView.tag;

        }

    }

    self.pageControl.currentPage = page;

}


- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView

{

    [selfstopTimer];

}


- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate

{

    [selfstartTimer];

}


- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView

{

    [selfupdateContent];

}


- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView

{

    [selfupdateContent];

}


#pragma mark - 内容更新

- (void)updateContent

{

    //设置图片

    for (int i =0; i<ImageViewCount; i++) {

        UIImageView *imageView =self.scrollView.subviews[i];

        //当前页码

        NSInteger index =self.pageControl.currentPage;


        if (i ==0) {//左边显示上一页

            index--;

        } elseif (i ==2) {//右边显示下一页

            index++;

        }

        //越界处理

        if (index <0) {

            index = self.pageControl.numberOfPages -1;

        } elseif (index >=self.pageControl.numberOfPages) {

            index = 0;

        }

        imageView.tag = index;

        imageView.image =self.images[index];

    }

    

    

    //设置偏移量在中间

    if (self.isInfiniteScrollVertical) {

        self.scrollView.contentOffset = CGPointMake(0,self.scrollView.frame.size.height);

    } else {

        self.scrollView.contentOffset = CGPointMake(self.scrollView.frame.size.width,0);

    }   

}


#pragma mark - 定时器处理

- (void)startTimer

{

    NSTimer *timer = [NSTimertimerWithTimeInterval:self.timetarget:selfselector:@selector(next)userInfo:nilrepeats:YES];

    [[NSRunLoopmainRunLoop]addTimer:timerforMode:NSRunLoopCommonModes];

    self.timer = timer;

}


- (void)stopTimer

{

    [self.timerinvalidate];

    self.timer =nil;

}


//下一张图片

- (void)next

{

    if (self.isInfiniteScrollVertical) {

        [self.scrollViewsetContentOffset:CGPointMake(0,2 * self.scrollView.frame.size.height)

         animated:YES];

    } else {

        [self.scrollViewsetContentOffset:CGPointMake(2 *self.scrollView.frame.size.width,0)

         animated:YES];

    }

}




//集成图片轮播

#import "ViewController.h"

#import "SZInfiniteLoopScrollView.h"


@interface ViewController ()

@end


@implementation ViewController


- (void)viewDidLoad {

    [superviewDidLoad];


    [selfsetupInfiniteScrollView];

}


//图片轮播

- (void)setupInfiniteScrollView{


    SZInfiniteLoopScrollView *scrollView = [[SZInfiniteLoopScrollViewalloc]init];

    //尺寸

    scrollView.frame =CGRectMake(0,0,self.view.frame.size.width,300);

    //图片切换时间

    scrollView.time =2;

    //图片数组

    scrollView.images =@[

                          [UIImageimageNamed:@"img_00"],

                          [UIImageimageNamed:@"img_01"],

                          [UIImageimageNamed:@"img_02"],

                          [UIImageimageNamed:@"img_03"],

                          [UIImageimageNamed:@"img_04"]

                          ];

    [self.viewaddSubview:scrollView];

    

    

//    //竖直方向的滚动

//    SZInfiniteLoopScrollView *scrollView1 = [[SZInfiniteLoopScrollView alloc] init];

//    

//    scrollView1.frame = CGRectMake(0, 250, self.view.frame.size.width, 100);

//    scrollView1.images = @[

//                           [UIImage imageNamed:@"img_00"],

//                           [UIImage imageNamed:@"img_01"],

//                           [UIImage imageNamed:@"img_02"],

//                           [UIImage imageNamed:@"img_03"],

//                           [UIImage imageNamed:@"img_04"]

//                           ];

//    

//    [self.view addSubview:scrollView1];

    //设置竖直方向滚动

//    scrollView1.infiniteScrollVertical = YES;

}




@end





0 0
原创粉丝点击