使用UIScrollView实现图片无限循环浏览

该Demo通过在UIScrollView中重复添加第一张和最后一张图片,实现了图片的无限循环浏览。当从第一张或最后一张图片滑动时,通过即时更新contentSize和currentPage,实现了平滑过渡的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、简介

本Demo实现了scrollView的循环滚动 其实总共有五个图片,但是在scroll中重复加入了第一张和最后一张 例如:五张图片编号为1,2,3,4,5 那么重复加入后7张图片的位置(用编号描述):5,1,2,3,4,5,1
【算法描述】
1)当从第一个图片向左拉时,显示了【那张重复的第五张图片】,当【那张重复的第五张图片】显示完全后,立即 重新设置scrollView的contentSet和pageControl的currentPage。
2) 当从第五张图片向右拉时,显示了【那张重复的第一张图片】,当【那张重复的第一张图片】显示完全后,立即 重新设置scrollView的contentSet和pageControl的currentPage。

二、代码

#import "ViewController.h"
#define IMAGE_NUM 7
@interface ViewController ()<UIScrollViewDelegate,UIPageViewControllerDelegate>

@property(weak,nonatomic)UIScrollView *scrollView;
@property(weak,nonatomic)UIPageControl *pageControl;
@property(nonatomic,assign)NSInteger currentIndex;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

#pragma mark - 创建scrollView
    //创建scrollView
    UIScrollView *view = [[UIScrollView alloc] init];
    //设置view的frame
    view.frame = CGRectMake(67, 50, 240, 128);


    //设置iamgeView的宽和高
    CGFloat imageWidth = 240;
    CGFloat imageHeight = 128;
    NSInteger imageIndex = 0;
    //给view添加图片
    for (NSInteger i = 0; i < IMAGE_NUM; i++) {

        if (i == 0) {
            imageIndex = 5;
        } else if (i == 6) {
            imageIndex = 1;
        } else{
            imageIndex = i;
        }



        //设置imageView的X和Y
        CGFloat imageX = imageWidth * i;
        CGFloat imageY = 0;
        //创建iamgeView
        UIImageView *imageView = [[UIImageView alloc] init];
        //设置iangeView的frame
        imageView.frame = CGRectMake(imageX, imageY, imageWidth, imageHeight);
        //设置iamgeView的iamge
        imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"img_0%ld", imageIndex]];
        [view addSubview:imageView];
    }
    //将scrollView的横竖两个方向的滚动条隐藏
    view.showsHorizontalScrollIndicator = NO;
    view.showsVerticalScrollIndicator = NO;
    //设置scrollView的contentSize
    view.contentSize = CGSizeMake(imageWidth * IMAGE_NUM, imageHeight);
    //设置scrollView的contentOffSet
    view.contentOffset = CGPointMake(imageWidth, 0);
    //允许scrollView分页
    view.pagingEnabled = YES;
    //设置view不让其自动布局
    self.view.autoresizesSubviews = NO;
    //设置view的代理
    view.delegate = self;
    self.scrollView = view;
    //将view添加到当前controller的view中
    [self.view addSubview:view];

#pragma mark - 创建pageControl
    //创建pageControl
    UIPageControl *control = [[UIPageControl alloc] init];
    //设置pageControl的frame
    control.frame = CGRectMake(167, 160, 40, 21);
    //设置其他指示器默认颜色
    control.pageIndicatorTintColor = [UIColor yellowColor];
    //设置当前指示器的颜色
    control.currentPageIndicatorTintColor = [UIColor redColor];
    //设置总共的页数
    control.numberOfPages = 5;
    //设置当前在第几页
    control.currentPage = 0;
    self.pageControl = control;
    [self.view addSubview:control];
}

-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
    //获取scrollView的宽
    CGFloat width = self.scrollView.bounds.size.width;

    //计算当前页数
    NSInteger currentPage = (self.scrollView.contentOffset.x + width * 0.5) / width;



    //更新pageControl的指示器
    self.pageControl.currentPage = currentPage - 1;
}

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
    //获取scrollView的宽
    CGFloat width = self.scrollView.bounds.size.width;

    //计算当前页数
    NSInteger currentPage = (self.scrollView.contentOffset.x + width * 0.5) / width;
    //如果滚动到了第0张:也就是【重复的第5张图片】
    if (currentPage == 0) {
        //将当前的index定位到第5张
        self.currentIndex = 5;
        //如果滚动到了第6张:也就是【重复的第1张图片】
    } else if(currentPage == 6){
        //将当前的index定位到第1张
        self.currentIndex = 1;

    } else{
        //其他情况,当前图片的index与pageControl的currentPage保持一致
        self.currentIndex = currentPage;

    }
    //重新设置scrollView的contentOffSet
    self.scrollView.contentOffset = CGPointMake(width * self.currentIndex, 0);
}
@end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值