`

UIScrollView 实现自动循环滚动

    博客分类:
  • IOS
阅读更多

1.实现UIScrollViewDelegate

2.

//
//  HomeView.m
//  Direction
//
//  Created by apple on 12-3-22.
//  Copyright (c) 2012年 __MyCompanyName__. All rights reserved.
//

#import "HomeView.h"

#define WIDTH_OF_SCROLL_PAGE 320
#define HEIGHT_OF_SCROLL_PAGE 460
#define WIDTH_OF_IMAGE 320
#define HEIGHT_OF_IMAGE 284
#define LEFT_EDGE_OFSET 0

@implementation HomeView
@synthesize scrollView;

- (void)dealloc {
    [scrollView release];
    [myTimer release];
    [super dealloc];
}
- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        [self addSubview:[self homeScrollView]];
    }
    return self;
}

-(UIScrollView *) homeScrollView{
    scrollView = [[UIScrollView alloc] init];
    CGRect scrollFrame;
    scrollFrame.origin.x = 0;
    scrollFrame.origin.y = 0;  
    scrollFrame.size.width = WIDTH_OF_SCROLL_PAGE;
    scrollFrame.size.height = HEIGHT_OF_SCROLL_PAGE;
    scrollView = [[UIScrollView alloc] initWithFrame:scrollFrame];
    scrollView.bounces = YES;
    scrollView.pagingEnabled = YES;
    scrollView.delegate = self;
    scrollView.userInteractionEnabled = YES;
    slideImages = [[NSMutableArray alloc] init];
    [slideImages addObject:@"image1.png"];
    [slideImages addObject:@"image2.png"];
    [slideImages addObject:@"image3.png"];
    
    //add the last image first
    
    UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:[slideImages objectAtIndex:([slideImages count]-1)]]];
    
    imageView.frame = CGRectMake(LEFT_EDGE_OFSET, 0, WIDTH_OF_IMAGE, HEIGHT_OF_IMAGE);
    [scrollView addSubview:imageView];
    [imageView release];
    for (int i = 0;i<[slideImages count];i++) {
        //loop this bit
        UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:[slideImages objectAtIndex:i]]];
        imageView.frame = CGRectMake((WIDTH_OF_IMAGE * i) + LEFT_EDGE_OFSET + 320, 0, WIDTH_OF_IMAGE, HEIGHT_OF_IMAGE);
        [scrollView addSubview:imageView];
        [imageView release];
        
    }
    
    //add the first image at the end
    imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:[slideImages objectAtIndex:0]]];
    imageView.frame = CGRectMake((WIDTH_OF_IMAGE * ([slideImages count] + 1)) + LEFT_EDGE_OFSET, 0, WIDTH_OF_IMAGE, HEIGHT_OF_IMAGE);
    [scrollView addSubview:imageView];
    [imageView release];
    [scrollView setContentSize:CGSizeMake(WIDTH_OF_SCROLL_PAGE * ([slideImages count] + 2), HEIGHT_OF_IMAGE)];
    [scrollView setContentOffset:CGPointMake(0, 0)];
    [self addSubview:scrollView];
    [self.scrollView scrollRectToVisible:CGRectMake(WIDTH_OF_IMAGE,0,WIDTH_OF_IMAGE,HEIGHT_OF_IMAGE) animated:NO];
    [self performSelector:@selector(updateScrollView) withObject:nil afterDelay:0.0f];
    return self.scrollView;
}

- (void) updateScrollView
{
    [myTimer invalidate];
    myTimer = nil;
    //time duration
    NSTimeInterval timeInterval = 3;
    //timer
    myTimer = [NSTimer scheduledTimerWithTimeInterval:timeInterval target:self
                                             selector:@selector(handleMaxShowTimer:)
                                             userInfo: nil
                                              repeats:YES];
}

- (void)handleMaxShowTimer:(NSTimer*)theTimer
{
    CGPoint pt = scrollView.contentOffset;
    int count = [slideImages count];
    if(pt.x == WIDTH_OF_IMAGE * count){
        [scrollView setContentOffset:CGPointMake(0, 0)];
        [self.scrollView scrollRectToVisible:CGRectMake(WIDTH_OF_IMAGE,0,WIDTH_OF_IMAGE,HEIGHT_OF_IMAGE) animated:YES];
    }else{
        [self.scrollView scrollRectToVisible:CGRectMake(pt.x+WIDTH_OF_IMAGE,0,WIDTH_OF_IMAGE,HEIGHT_OF_IMAGE) animated:YES];
    }
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    int currentPage = floor((self.scrollView.contentOffset.x - self.scrollView.frame.size.width / ([slideImages count]+2)) / self.scrollView.frame.size.width) + 1;
    if (currentPage==0) {
        //go last but 1 page
        [self.scrollView scrollRectToVisible:CGRectMake(WIDTH_OF_IMAGE * [slideImages count],0,WIDTH_OF_IMAGE,HEIGHT_OF_IMAGE) animated:NO];
    } else if (currentPage==([slideImages count]+1)) { //如果是最后+1,也就是要开始循环的第一个
        [self.scrollView scrollRectToVisible:CGRectMake(WIDTH_OF_IMAGE,0,WIDTH_OF_IMAGE,HEIGHT_OF_IMAGE) animated:NO];
    }
}


/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
    // Drawing code
}
*/

@end
 
分享到:
评论

相关推荐

    UIScrollView 循环滚动 手势 自动 滚动

    本教程将详细讲解如何实现`UIScrollView`的循环滚动功能,并结合手势识别和自动滚动,以提升用户体验。我们将通过分析提供的压缩包文件中的`UIScrollViewLoop-1`、`UIScrollViewLoop-2`和`UIScrollViewLoop`来探索这...

    UIScrollView 无限自动循环

    在电商应用中,我们经常看到一种效果,那就是商品推荐或广告轮播图能够实现无限自动循环,这正是`UIScrollView`结合`UIPageControl`功能的一种巧妙运用。本文将深入探讨如何实现这个功能。 首先,`UIScrollView`...

    UIScrollView实现图片无限滚动Demo

    在本示例项目“UIScrollView实现图片无限滚动Demo”中,开发者利用`UIScrollView` 和其相关特性,创建了一个可以无限循环滚动图片的界面,同时集成了`UIPageControl` 用于指示当前显示的图片位置。这个功能常用于...

    UIScrollView自动滚动以及手动滚动的实现

    为了实现自动滚动,我们需要设置一个定时器(NSTimer)来定期改变UIScrollView的内容偏移量(contentOffset)。 1. **自动滚动的实现**: - 创建一个NSTimer对象,设定时间间隔(如2秒)。 - 在timer的回调方法中...

    UIScrollview循环滚动

    然后,为了实现自动循环滚动,我们需要利用NSTimer。NSTimer是一个定时器对象,可以按照指定的时间间隔执行某个任务。我们创建一个NSTimer,设置其时间间隔(例如2秒),并关联一个方法,该方法负责改变ScrollView的...

    UIScrollview左右循环滑动与自动轮播

    4. **实现自动轮播**:可以使用`NSTimer`定时改变`contentOffset.x`来实现自动轮播。每次轮播时,将`contentOffset.x`增加或减少一个屏幕宽度,使得视图向左或向右移动。同时,需要处理边界条件,当滑动到最后一张或...

    uiscrollview 无缝循环滚动

    然而,标准的`UIScrollView`并不支持自动无缝循环滚动,即当用户滑动到底部或顶部时,内容不能立即从开头或结尾重新出现。为了实现这种效果,开发者通常需要自定义`UIScrollView`的行为,这涉及到对`...

    UIScrollView的循环滚动+UIPageControll+NSTimer实现的自动循环滚动播放最终完善版

    资源代码简洁,使用3个UIImageView实现了重用机制,既实现了NSTimer自动展示效果,并且在手动拖动时会停止NSTimer,拖动结束便会恢复, 也实现了UIPageControll 在滑动到页面一半时就能够实时响应。总共花时3天才写完...

    自动循环滚动的UIScrollView

    UIScrollView 实现自动滚动 循环播放的视图 其实大家对这种demo并不少见了,但是我还是想自己去动手封装一个可以在任何项目中拿来就可以使用的,自己写的代码要比粘贴复制的代码更有意义,自己也就理解的更加深刻了...

    UIScrollView定时滚动和循环滚动,可点击图片和PageController

    这个示例代码展示了如何实现一个带有定时滚动和循环滚动功能的`UIScrollView`,同时结合了`UIPageControl`来指示当前显示的页面,并允许用户点击图片。 首先,我们看到`ViewController`继承自`UIViewController`并...

    UIScrollview 图片无缝连续自动滚动

    综上所述,实现“UIScrollview 图片无缝连续自动滚动”涉及到的知识点包括:UIScrollview的基本使用,内容Size和Frame的设置,图片加载和布局,自动滚动的实现,循环滑动逻辑,以及性能优化。通过理解和掌握这些技术...

    uiscrollview循环滚动

    实现`UIScrollView`的循环滚动是一项常见的需求,尤其在展示一系列相似内容时,如轮播图、商品列表等。在这个例子中,我们将深入探讨如何设置并实现`UIScrollView`的循环滚动功能。 首先,我们需要理解`...

    iOS 自动循环滚动视图

    要实现自动循环滚动,我们需要关注以下几个关键点: 1. **数据源(DataSource)**:你需要提供滚动视图的数据源,这通常是数组形式的图片URLs或者其他数据对象。每个对象对应滚动视图中的一个子视图。 2. **内容...

    uiscrollView+uipageControl无缝循环可点击

    实现“无缝循环”意味着当用户滚动到最后一张图片时,`UIScrollView` 应该自动滚动回第一张图片,而不会出现空白或明显的跳跃。这种效果需要通过巧妙地设置 `UIScrollView` 的内容尺寸和内容偏移量来实现。同时,...

    iOS开发中使用UIScrollView实现无限循环的图片

    4. 循环滚动逻辑:当用户滚动到最后一张图片时,系统会自动重置contentOffset,使得第一张图片再次出现,实现无缝循环。为了达到这一效果,我们需要监听UIScrollView的滚动事件(scrollViewDidScroll)并在适当的...

    iOS:UIScrollView实现轮播

    实现轮播效果,通常是指在有限的显示区域内,通过滑动显示一系列图片或视图,达到自动循环播放的效果。这在很多应用的启动页、广告展示或者商品展示等场景中非常常见。以下将详细介绍如何使用UIScrollView来实现轮播...

    一个循环滚动的UIScrollView

    在很多应用场景中,如新闻列表、图片轮播等,我们需要实现一个循环滚动的效果,使得内容看起来是无限循环的。本文将详细探讨如何在iOS中创建一个循环滚动的`UIScrollView`。 首先,我们需要理解`UIScrollView`的...

    swift中UIScrollView广告循环滚动

    4. 自动滚动:实现广告的自动循环滚动,我们可以使用NSTimer配合scrollRectToVisible方法。首先,创建一个定时器,每隔一定时间滚动到下一个广告位置。 ```swift let timer = Timer.scheduledTimer(timeInterval: ...

    UIScrollView循环滚动

    首先,要实现`UIScrollView`的循环滚动,我们需要理解其工作原理。核心在于当用户滚动到`UIScrollView`的边界时,我们可以动态地添加或移除视图,使其看起来像在循环。这需要对`UIScrollView`的`contentSize`属性和...

Global site tag (gtag.js) - Google Analytics