UIScrollView利用NSTimer附带UIPageControl自动循环

网上已经有很多类似的文章了,最近看了一下别人写的Demo,然后就自己也写了一个类似的自动循环,原理 与网上的一样,该文中用了三个UIImageView控件循环显示

虽然只能看到三个,但scrollView中有五个UIImageView的位置,例如 3 1 2 3 1  只显示中间三个,剩下两个作为过渡来使用。 能基本满足项目需求 看代码

声明三个属性

@property (strong, nonatomic) UIScrollView * scrollView;
@property (strong, nonatomic) UIPageControl * pageControl;
@property (weak, nonatomic) NSTimer * timer; // 用来循环显示

在viewDidLoad方法中声明一个数组,里面用来放图片,这里用背景颜色来代替

// 这里只用背景颜色来代替, 可以直接用图片来代替颜色
    NSArray * colors = @[[UIColor redColor],[UIColor greenColor],[UIColor blueColor]];

初始化scrollView和pageController 并设置相关属性  这里不再赘述,看循环添加imageView

for (int i = 0; i < colors.count; i++) {
        CGRect rect = self.scrollView.frame;
        // 从第二个位置开始显示
        UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(rect.size.width * (i+1), 0, rect.size.width, HEIGHTFORSCROLLVIEW)];
        imageView.backgroundColor = colors[i];
        [self.scrollView addSubview:imageView];
        // 如果想添加点击事件,可在此添加tap手势,此处不再赘述
        imageView.userInteractionEnabled = YES;
    }

然后再添加两个imageView

// 第一个位置
    UIImageView * firstIV = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, HEIGHTFORSCROLLVIEW)];
    firstIV.backgroundColor = colors[colors.count-1];
    [self.scrollView addSubview:firstIV];
    
    // 最后一个位置
    UIImageView * lastIV = [[UIImageView alloc] initWithFrame:CGRectMake(SCREEN_WIDTH * (colors.count + 1), 0, SCREEN_WIDTH, HEIGHTFORSCROLLVIEW)];
    lastIV.backgroundColor = colors[0];
    [self.scrollView addSubview:lastIV];

// 虽然只显示三个视图 但要给scrollView 留五个位置 第一个和最后一个不需要显示
    [self.scrollView setContentSize:CGSizeMake(SCREEN_WIDTH * (colors.count + 2), HEIGHTFORSCROLLVIEW)];
    [self.view addSubview:self.scrollView];
    [self.view addSubview:self.pageControl];

第一次运行时显示第二个位置的imageView

[self.scrollView scrollRectToVisible:CGRectMake(SCREEN_WIDTH, 0, SCREEN_WIDTH, HEIGHTFORSCROLLVIEW) animated:NO];

最后加个计时器 viewDidLoad方法中就这些

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

看看scrollView的代理方法

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    
    CGPoint offset = scrollView.contentOffset;
    NSInteger page = offset.x / scrollView.frame.size.width;
    page--;
    page = page > 3 ? 0 : page;
    self.pageControl.currentPage = page;
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    // 重新计时
    [self.timer invalidate];
    self.timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(goNextPage) userInfo:Nil repeats:YES];
    CGFloat pageWidth = scrollView.frame.size.width;
    CGPoint offset = scrollView.contentOffset;
    NSLog(@"offset:%f",offset.x);
    NSInteger currentPage = floor((self.scrollView.contentOffset.x-pageWidth/2)/pageWidth)+1;

    if (currentPage == 4) {
        [self.scrollView scrollRectToVisible:CGRectMake(SCREEN_WIDTH, 0, SCREEN_WIDTH, HEIGHTFORSCROLLVIEW) animated:NO];
    }else if (currentPage == 0) {
        [self.scrollView scrollRectToVisible:CGRectMake(SCREEN_WIDTH * 3, 0, SCREEN_WIDTH, HEIGHTFORSCROLLVIEW) animated:NO];
    }
}
计时器的方法  自动循环
- (void)goNextPage
{
    CGFloat pageWidth = self.scrollView.frame.size.width;
    NSInteger currentPage = floor((self.scrollView.contentOffset.x-pageWidth/2)/pageWidth)+1;
    currentPage++;
    if (currentPage == 4) {
        [self.scrollView scrollRectToVisible:CGRectMake(SCREEN_WIDTH, 0, SCREEN_WIDTH, HEIGHTFORSCROLLVIEW) animated:NO];
    }else if (currentPage == 0) {
        [self.scrollView scrollRectToVisible:CGRectMake(SCREEN_WIDTH * 3, 0, SCREEN_WIDTH, HEIGHTFORSCROLLVIEW) animated:NO];
    }else {
        [self.scrollView scrollRectToVisible:CGRectMake(currentPage * SCREEN_WIDTH, 0, SCREEN_WIDTH, HEIGHTFORSCROLLVIEW) animated:YES];
    }
}


然后

// 释放计时器
- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
    [self.timer invalidate];
    self.timer = Nil;
}

最后 给大家提供个下载地址 : ScrollViewAutomic





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值