iOS ScrollView 无限循环

用 scrollview做,循环展示,1~10个可以比较简单,耗能比较少,假设100,1000,等等或者更多,总不能创建这么多个view。

scrollview做,循环展示,1~10个可以比较简单,耗能比较少,假设100,1000,等等或者更多,总不能创建这么多个view。

可以参考这个博客,写的漂亮,我是在这个基础上做了点封装

这篇博客 主要介绍了 用3个view 来显示无限个 view,主要是通过- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 来计算当前滑动了到第几个,然后调整 3个view的位置。

我自定义了一个view EndlessLoopShowView

#import @class EndlessLoopShowView;@protocol EndlessLoopShowViewDelegate @optional/* 滑动到第几个位置 **/- (void)endlessLoop:(EndlessLoopShowView*)showView scrollToIndex:(NSInteger)currentIndex;@end@interface EndlessLoopShowView : UIView/* 返回图片的显示,可以传入 image ,imageName ,url ,自己可以自定义 **/@property (nonatomic,strong) NSArray * imageDataArr;@property (nonatomic,weak) id delegate;@end
//// EndlessLoopShowView.m// EndlessLoopShowView//// Created by apple on 16/9/26.// Copyright ? 2016年 李重阳. All rights reserved.//#import "EndlessLoopShowView.h"/*无限循环的视图 **/@interface EndlessLoopShowView ()@property (nonatomic,strong) UIScrollView * scrollView;@property (nonatomic,strong) UIImageView *leftImageView;@property (nonatomic,strong) UIImageView *centerImageView;@property (nonatomic,strong) UIImageView *rightImageView;@property (nonatomic,assign) NSInteger currentIndex;/* 当前滑动到了哪个位置**/@property (nonatomic,assign) NSInteger imageCount;/* 图片的总个数 **///http://www.cnblogs.com/kenshincui/p/3913885.html#ImageViewer@end@implementation EndlessLoopShowView#pragma mark - 生命周期- (instancetype)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { [self setupView]; } return self;}- (void)setupView { _currentIndex = -1; [self addSubview:self.scrollView]; //添加图片控件 [self addImageViews];}- (void)layoutSubviews { [super layoutSubviews]; self.scrollView.frame = self.bounds; CGFloat imageW = CGRectGetWidth(self.scrollView.bounds); CGFloat imageH = CGRectGetHeight(self.scrollView.bounds); self.leftImageView.frame = CGRectMake(imageW*0, 0, imageW, imageH); self.centerImageView.frame = CGRectMake(imageW*1, 0, imageW, imageH); self.rightImageView.frame = CGRectMake(imageW*2, 0, imageW, imageH); self.scrollView.contentSize= CGSizeMake(imageW*3, 0); self.currentIndex = 0; [self setScrollViewContentOffsetCenter];}#pragma mark - 私有方法#pragma mark - get/set方法- (UIScrollView *)scrollView { if (_scrollView == nil) { _scrollView=[[UIScrollView alloc]init]; //设置代理 _scrollView.delegate=self; //设置分页 _scrollView.pagingEnabled=YES; //去掉滚动条 _scrollView.showsHorizontalScrollIndicator=NO; } return _scrollView;}/* 重写 setCurrent 方法 并且赋值 **/- (void)setCurrentIndex:(NSInteger)currentIndex { if (_currentIndex != currentIndex) { _currentIndex = currentIndex; NSInteger leftImageIndex = (currentIndex+_imageCount-1)%_imageCount; NSInteger rightImageIndex= (currentIndex+1)%_imageCount; _centerImageView.image =[UIImage imageNamed:self.imageDataArr[currentIndex]]; _leftImageView.image =[UIImage imageNamed:self.imageDataArr[leftImageIndex]]; _rightImageView.image =[UIImage imageNamed:self.imageDataArr[rightImageIndex]]; [self setScrollViewContentOffsetCenter]; if ([self.delegate respondsToSelector:@selector(endlessLoop:scrollToIndex:)]) { [self.delegate endlessLoop:self scrollToIndex:currentIndex]; } }}#pragma mark 添加图片三个控件-(void)addImageViews { _leftImageView=[[UIImageView alloc]init]; _leftImageView.contentMode=UIViewContentModeScaleAspectFit; [_scrollView addSubview:_leftImageView]; _centerImageView=[[UIImageView alloc]init]; _centerImageView.contentMode=UIViewContentModeScaleAspectFit; [_scrollView addSubview:_centerImageView]; _rightImageView=[[UIImageView alloc]init]; _rightImageView.contentMode=UIViewContentModeScaleAspectFit; [_scrollView addSubview:_rightImageView];}/* 把scrollView 偏移到中心位置 **/- (void)setScrollViewContentOffsetCenter { [self.scrollView setContentOffset:CGPointMake(CGRectGetWidth(self.scrollView.bounds), 0) animated:NO];}- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { CGPoint offset=[_scrollView contentOffset]; if (offset.x>CGRectGetWidth(scrollView.frame)) { //向右滑动 self.currentIndex=(self.currentIndex+1)%_imageCount; }else if(offset.x

用法

- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. EndlessLoopShowView * showView = [[EndlessLoopShowView alloc]initWithFrame:CGRectMake(0, 100, 200, 200)]; showView.backgroundColor = [UIColor redColor]; showView.imageDataArr = @[@"1",@"2",@"3",@"4",@"5"]; showView.delegate = self; [self.view addSubview:showView];}- (void)endlessLoop:(EndlessLoopShowView *)showView scrollToIndex:(NSInteger)currentIndex { NSLog(@"currentIndex = %ld",currentIndex);}

文章转自 Mr_Lee_的简书

Demo链接: GitHub

未登录用户
全部评论0
到底啦