IOS之UIScrollView分页无限循环滚动框架

IOS之UIScrollView分页无限循环滚动框架

1原理

先定义3个imageView分别为中间图片视图 midView丶左边图片视图leftView丶右边图片视图rightView,将要展现出来的图片放到一个imageNames数组中,定义_currentNumber来确定分页控件的页号。
将imageView的第currentNumber张图片传给midView,
imageView的第(_currentNumber-1+_imageNames.count) % _imageNames.count张图片传给rightView ,
imageView的第(_currentNumber+1+_imageNames.count) % _imageNames.count张图片传给leftView .
如果滑动视图向右滑时:
_currentNumber = (_currentNumber - 1 + _imageNames.count) % _imageNames.count;
如果向左滑动时:
_currentNumber = (_currentNumber + 1 + _imageNames.count) % _imageNames.count;

2.UIView中的代码

#import "MyScrollView.h"

@interface MyScrollView ()<UIScrollViewDelegate>


@property(nonatomic,strong)UIScrollView *scrollView;
@property(nonatomic, strong)UIPageControl *pageControl;
@property(nonatomic, strong)UIImageView *leftImageView;
@property(nonatomic, strong)UIImageView *middleImageView;
@property(nonatomic, strong)UIImageView *rightImageView;
@property(nonatomic, assign)NSInteger currentNumber;
@property(weak,nonatomic)NSTimer * timer;

@end


@implementation MyScrollView

-(instancetype)initWithFrame:(CGRect)frame {

    if (self = [super initWithFrame:frame]) {


    }

    return self;
}


-(void)setImageNames:(NSArray *)imageNames {
    _imageNames = imageNames;

    //创建子控件
    [self creatSubViews];

    [self startTimer];



}

#pragma mark - 1.创建子视图
-(void)creatSubViews {

    CGFloat width = self.frame.size.width;
    CGFloat height = self.frame.size.height;

    _scrollView = [[UIScrollView alloc] initWithFrame:self.bounds];
    _scrollView.delegate = self;
    _scrollView.pagingEnabled = YES;
    _scrollView.showsHorizontalScrollIndicator = NO;
    _scrollView.showsVerticalScrollIndicator = NO;
    _scrollView.contentSize = CGSizeMake(width * 3, height);

    [self addSubview:_scrollView];

    //创建分页控件
    _pageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(0, self.frame.size.height - 30, width, 30)];

    _pageControl.numberOfPages = _imageNames.count;
    _pageControl.currentPage = 0;

    _pageControl.pageIndicatorTintColor = [UIColor orangeColor];
    _pageControl.currentPageIndicatorTintColor = [UIColor greenColor];

    [self addSubview:_pageControl];


    //3.创建左中右三个图片视图
    _leftImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, width, height)];
    _middleImageView = [[UIImageView alloc] initWithFrame:CGRectMake(width, 0, width, height)];
    _rightImageView = [[UIImageView alloc] initWithFrame:CGRectMake(width *2 , 0, width, height)];


    [_scrollView addSubview:_leftImageView];
    [_scrollView addSubview:_middleImageView];
    [_scrollView addSubview:_rightImageView];

    [self loadImage];
}


-(void)loadImage {

    _middleImageView.image = [UIImage imageNamed:_imageNames[_currentNumber]];


    NSInteger leftIndex = (_currentNumber - 1 + _imageNames.count) % _imageNames.count;
    _leftImageView.image = [UIImage imageNamed:_imageNames[leftIndex]];


    NSInteger rightIndex = (_currentNumber + 1) % _imageNames.count;
    _rightImageView.image = [UIImage imageNamed:_imageNames[rightIndex]];

}


-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
    NSLog(@"%f",scrollView.contentOffset.x);


    //1.判断滑动方向
    if (scrollView.contentOffset.x > scrollView.bounds.size.width) {//向左滑动

        _currentNumber = (_currentNumber + 1) % _imageNames.count;

    }else if(scrollView.contentOffset.x < scrollView.bounds.size.width){ //向右滑动
        _currentNumber = (_currentNumber - 1 + _imageNames.count) % _imageNames.count;

    }

    [self loadImage];

    _pageControl.currentPage = _currentNumber;

    scrollView.contentOffset = CGPointMake(_scrollView.bounds.size.width, 0);




}

-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    [self stopTimer];
}
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    [self startTimer];
}


#pragma mark -- 定时器
-(void)startTimer
{
    NSTimer * timer = [NSTimer timerWithTimeInterval:2 target:self selector:@selector(next) userInfo:nil repeats:YES];
    [[NSRunLoop mainRunLoop]addTimer:timer forMode:NSRunLoopCommonModes];
    self.timer = timer;
}

-(void)stopTimer
{
    [self.timer invalidate];
    self.timer = nil;
}
-(void)next
{
    _currentNumber = (_currentNumber + 1) % _imageNames.count;
    [self loadImage];
    _pageControl.currentPage = _currentNumber;


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


}



@end

代码下载链接

@点击进入GitHub下载源代码

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值