150行代码搞定轮播图

思路:底层scrollview contentsize为3个屏幕宽 添加三个图片视图0,1,2  初始便偏移到中间视图1(中间一个图片视图,左右各一个)   左滑或者右滑结束 scrollview都滑回原来位置,且无动画,刷新的是图片视图图片地址,也就是每滑动一下需要处理的是数组元素的循环移动。通过刷新图片视图的图片地址达到图片无线滚动的视图效果,,同时添加计时器自动滚动,,滑动时计时器销毁,,滑动结束计时器开启(sdwebimage 加载图片有缓存机制,只要图片地址没变网络加载只走一次)

图片个数无限制

借用SDCycleScrollView的图片来用用

自动滚动:

手动滚动:

计时器停止和启动

 

demo :链接:https://pan.baidu.com/s/1wjgSHoO4V_OkIHC37RQyMw  密码:60ah

创建UIview为  ScrollImageView

#import <UIImageView+WebCache.h>

 

@interface ScrollImageView()<UIScrollViewDelegate>

/// 底部滚动视图

@property (nonatomic, strong) UIScrollView *backScrollView;

/// 判断滚动方向

@property (nonatomic, assign) CGFloat contentOffsetX;

/// 图片地址数组

@property (nonatomic, strong) NSMutableArray *imageArr;

/// 点击链接地址数组

@property (nonatomic, strong) NSMutableArray *imageUrlArr;

@property (nonatomic, strong) NSMutableArray *imageUrlsaveArr;

@property (nonatomic, strong) NSMutableArray *imagesaveArr;

@property (nonatomic, strong) NSMutableArray *imageViewArr;

@property (nonatomic, strong) NSMutableArray *tapGestureArr;

@property (nonatomic, strong) NSTimer *timer;

 

@end

 

@implementation ScrollImageView

 

- (instancetype)initWithFrame:(CGRect)frame{

    self = [super initWithFrame:frame];

    if (self) {

        

        self.imageViewArr = [NSMutableArray array];

        self.timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(timeAction) userInfo:nil repeats:YES];

        [self createView];

    }

    return self;

}

- (void)reloadScrollView:(NSMutableArray *)imageArr urlArr:(NSMutableArray *)urlArr{

    self.imageArr = [NSMutableArray array];

    self.imageUrlArr = [NSMutableArray array];

    if (imageArr.count>0) {

        if (imageArr.count == 1) {

            for (NSInteger i =0; i<3; i++) {

                [self.imageArr addObject:imageArr[0]];

                [self.imageUrlArr addObject:urlArr[0]];

            }

            [self.timer invalidate];

            self.timer = nil;

            self.backScrollView.scrollEnabled = NO;

        }else if (imageArr.count == 2){

            for (NSInteger i = 0; i<4; i++) {

                if (i<2) {

                    [self.imageArr addObject:imageArr[i]];

                    [self.imageUrlArr addObject:urlArr[i]];

                }else{

                    [self.imageArr addObject:imageArr[i-2]];

                    [self.imageUrlArr addObject:urlArr[i-2]];

                }

            }

        }else{

            /// 对图片数组和点击链接地址处理 使第一张图片显示在三个图片z视图的中间位置

            for (NSInteger i = 0; i<imageArr.count; i++) {

                if (i == 0) {

                    [self.imageArr addObject:imageArr[imageArr.count-1]];

                    [self.imageUrlArr addObject:urlArr[urlArr.count-1]];

                }else{

                    [self.imageArr addObject:imageArr[i-1]];

                    [self.imageUrlArr addObject:urlArr[i-1]];

                }

            }

        }

        /// 对图片视图数组中的UIimageview设置图片

        for (NSInteger i = 0; i<3; i++) {

            UIImageView *image = self.imageViewArr[i];

            [image sd_setImageWithURL:[NSURL URLWithString:self.imageArr[i]]];

        }

    }else{

        [self.timer invalidate];

        self.timer = nil;

        self.backScrollView.scrollEnabled = NO;

    }

}

- (void)createView{

   

    self.backScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];

    self.backScrollView.contentSize = CGSizeMake(self.frame.size.width*3, 0);

    [self addSubview:self.backScrollView];

    self.backScrollView.delegate = self;

    self.backScrollView.pagingEnabled = YES;

    self.backScrollView.showsHorizontalScrollIndicator = NO;

    ///固定只有三个图片视图

    [self setScrollViewContentOffsetCenter];

    for (NSInteger i = 0; i<3; i++) {

        UIImageView *image = [[UIImageView alloc] initWithFrame:CGRectMake(i*self.frame.size.width, 0, self.frame.size.width, self.frame.size.height)];

        image.userInteractionEnabled = YES;

        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)];

        [image addGestureRecognizer:tap];

        image.tag = i;

        [self.imageViewArr addObject:image];

        [self.backScrollView addSubview:image];

    }

    

}

图片的点击代理方法

- (void)tapAction:(UITapGestureRecognizer *)tap{

    [self.delegate scrollImageViewTapAction:self.imageUrlArr[1]];

}

/// 偏移到中心位置

- (void)setScrollViewContentOffsetCenter {

    [self.backScrollView setContentOffset:CGPointMake(self.frame.size.width, 0) animated:NO];

}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{

    int contentOffsetX = scrollView.contentOffset.x;

    

    /// 左滑

    if(contentOffsetX >= (2 * self.frame.size.width)) {

        [self.backScrollView setContentOffset:CGPointMake(self.frame.size.width, 0)];

        [self reloadImage:1];

    }

    /// 右划

    if(contentOffsetX <= 0) {

        [self.backScrollView setContentOffset:CGPointMake(self.frame.size.width, 0)];

        [self reloadImage:0];

    }

}

- ( void )scrollViewWillBeginDragging:( UIScrollView *)scrollView{

    [self.timer invalidate];

    self.timer = nil;

}

///  手指已经离开屏幕

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

        self.timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(timeAction) userInfo:nil repeats:YES];

}

- (void)reloadImage:(NSInteger)type{

    

    if (type == 0) {

        /// 右划 图片数组像右移动 第0个图变成最后一个 第一个变成第0个 第二个变成第1个。。。。最后一个变成第0个

        self.imagesaveArr = [NSMutableArray arrayWithArray:self.imageArr];

        self.imageUrlsaveArr = [NSMutableArray arrayWithArray:self.imageUrlArr];

        self.imageArr = [NSMutableArray array];

        self.imageUrlArr = [NSMutableArray array];

        for (NSInteger i = 0; i<self.imagesaveArr.count; i++) {

            if (i == 0) {

                [self.imageArr addObject:self.imagesaveArr[self.imagesaveArr.count - 1]];

                [self.imageUrlArr addObject:self.imageUrlsaveArr[self.imageUrlsaveArr.count - 1]];

            }else{

                [self.imageArr addObject:self.imagesaveArr[i-1]];

                [self.imageUrlArr addObject:self.imageUrlsaveArr[i-1]];

            }

        }

        for (NSInteger i = 0; i<self.imageViewArr.count; i++) {

            UIImageView *image = self.imageViewArr[i];

            [image sd_setImageWithURL:[NSURL URLWithString:self.imageArr[i]]];

        }

    }else{

        /// 左滑 图片数组像左移动 第0个图变成第一个 第一个变成第2个 第二个变成第3个。。.。最后一个变成第0个

        self.imagesaveArr = [NSMutableArray arrayWithArray:self.imageArr];

        self.imageUrlsaveArr = [NSMutableArray arrayWithArray:self.imageUrlArr];

        self.imageUrlArr = [NSMutableArray array];

        self.imageArr = [NSMutableArray array];

        for (NSInteger i = 0; i<self.imagesaveArr.count; i++) {

            if(i == self.imagesaveArr.count - 1){

                [self.imageArr addObject:self.imagesaveArr[0]];

                [self.imageUrlArr addObject:self.imageUrlsaveArr[0]];

            }else{

                [self.imageArr addObject:self.imagesaveArr[i+1]];

                [self.imageUrlArr addObject:self.imageUrlsaveArr[i+1]];

            }

        }

        for (NSInteger i = 0; i<self.imageViewArr.count; i++) {

            UIImageView *image = self.imageViewArr[i];

            [image sd_setImageWithURL:[NSURL URLWithString:self.imageArr[i]]];

        }

    }

}

- (void)timeAction{

    [self.backScrollView setContentOffset:CGPointMake(self.frame.size.width*2, 0) animated:YES];

}

 

controller使用

ScrollImageView *view2 = [[ScrollImageView alloc] initWithFrame:CGRectMake(0, 300,[UIScreen mainScreen].bounds.size.width , 200)];

    [view2 reloadScrollView:[NSMutableArray arrayWithObjects:@"https://ss2.baidu.com/-vo3dSag_xI4khGko9WTAnF6hhy/super/whfpf%3D425%2C260%2C50/sign=a4b3d7085dee3d6d2293d48b252b5910/0e2442a7d933c89524cd5cd4d51373f0830200ea.jpg",

                             @"https://ss0.baidu.com/-Po3dSag_xI4khGko9WTAnF6hhy/super/whfpf%3D425%2C260%2C50/sign=a41eb338dd33c895a62bcb3bb72e47c2/5fdf8db1cb134954a2192ccb524e9258d1094a1e.jpg",

                             @"http://c.hiphotos.baidu.com/image/w%3D400/sign=c2318ff84334970a4773112fa5c8d1c0/b7fd5266d0160924c1fae5ccd60735fae7cd340d.jpg", nil] urlArr:[NSMutableArray arrayWithObjects:@"0----------",@"1-----------",@"2-----------",@"3-----------", nil]];

    view2.delegate = self;

    [self.view addSubview:view2];

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值