思路:底层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];