无限scrollView动画

时间:2011-12-02 13:28:10

标签: iphone animation uiscrollview

我在无限滚动视图中有5张图片。

因此,为了使scrollView无限/圆形,我将我的图像定位为:

5 1 2 3 4 5 1 含义:最后一张图片第一张图片第二张图片.....最后一张图片第一张图片

为了使它变得无限,我有以下代码:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    if(self.scrollView.contentOffset.x == 0){

    [self.scrollView scrollRectToVisible:CGRectMake(self.view.frame.size.width*pathImages.count, 0, self.view.frame.size.width, self.view.frame.size.height) animated:NO];  
        }
    else if (self.scrollView.contentOffset.x == self.view.frame.size.width*(pathImages.count+1)) {         

    [self.scrollView scrollRectToVisible:CGRectMake(self.view.frame.size.width,0 ,self.view.frame.size.width, self.view.frame.size.height) animated:NO];    
    }
}

这意味着当我在最后一张照片时,contentOffset的{​​{1}}被设置为转到第一张照片 - 这样我获得了无限scrollView

scrollView.

这条神奇的界限:

  What I wanted next was for my scrollView to slide automatically-for this I set a timer which calls one method-onTimer:

- (void) onTimer{
    NSLog(@"flip pages");
    if(h < pathImages.count*self.view.frame.size.width)
    {
        h+= self.view.frame.size.width;

    }
    else
    {
        h=self.view.frame.size.width;
    }

    if(self.scrollView.contentOffset.x == 0){

        [self.scrollView scrollRectToVisible:CGRectMake(self.view.frame.size.width*pathImages.count, 0, self.view.frame.size.width, self.view.frame.size.height) animated:NO];  

    }

    if (self.scrollView.contentOffset.x == self.view.frame.size.width*pathImages.count)         

    {      

        [self.scrollView scrollRectToVisible:CGRectMake(self.view.frame.size.width,0 ,self.view.frame.size.width, self.view.frame.size.height) animated:NO];                         

    }

    else

    [UIView animateWithDuration:1 
                          delay:0 
                        options:UIViewAnimationOptionCurveEaseInOut 
                     animations:^{ self.scrollView.contentOffset = CGPointMake(h, 0); } 
                     completion:NULL];
}

使用动画自动执行scoll。

除此之外,一切都很棒:

在我查看最后一张图片后,我应该设置滚动视图的偏移量,以便回到带有动画的第一张图片。

好吧,如果我这样做:

[UIView animateWithDuration:1 
                              delay:0 
                            options:UIViewAnimationOptionCurveEaseInOut 
                         animations:^{ self.scrollView.contentOffset = CGPointMake(h, 0); } 
                         completion:NULL];

在观看最后一张照片后,为了到达第一张照片......它会遍历所有其他照片。

我想要的是:在我查看最后一张照片后,让我回到应该使用动画加载到屏幕上的第一张照片,但没有查看它们之间的所有其他照片。谢谢

1 个答案:

答案 0 :(得分:4)

如果我看到这个问题,问题是,你再次使用动画将视图滚动回零位置。我相信你需要修改你发布的最后一段代码:

if (self.scrollView.contentOffset.x == self.view.frame.size.width*pathImages.count)         
            {      
        [self.scrollView scrollRectToVisible:CGRectMake(self.view.frame.size.width,0 ,self.view.frame.size.width, self.view.frame.size.height) animated:NO];//no animation on returning
[self onTimer];//even if this code is already inside method "onTimer"
        }

而不是你在做什么尝试使用滚动视图,当时只显示3到5个图像(如果它们是全屏的)。如果您的应用程序中有许多图像,它会因为高内存消耗而崩溃。尝试使用这个几乎符合您要求的测试示例:

HEADER:

#import <Foundation/Foundation.h>

@interface IScrollView : UIScrollView <UIScrollViewDelegate> {
    NSMutableArray *imagePaths;
    UIImageView *imageViews[3];
    NSInteger currentImage;
    NSTimer *animationTimer;//weak link
}
@end

消息来源:

#import "IScrollView.h"

@implementation IScrollView
- (UIImage *)imageFromResourcesWithName:(NSString *)name {
    UIImage *ret = [[UIImage alloc] initWithContentsOfFile:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:name]];
    return [ret autorelease];
}
- (id)initWithFrame:(CGRect)frame {
    if((self = [super initWithFrame:frame])) {
        imagePaths = [[NSMutableArray alloc] init];
        [imagePaths addObject:@"imag1.png"];
        [imagePaths addObject:@"imag2.png"];
        [imagePaths addObject:@"imag3.png"];
        [imagePaths addObject:@"imag4.png"];
        [imagePaths addObject:@"imag5.png"];
        imageViews[0] = [[UIImageView alloc] initWithFrame:CGRectMake(320.0f*0, .0f, 320.0f, 480.0f)];
        imageViews[1] = [[UIImageView alloc] initWithFrame:CGRectMake(320.0f*1, .0f, 320.0f, 480.0f)];
        imageViews[2] = [[UIImageView alloc] initWithFrame:CGRectMake(320.0f*2, .0f, 320.0f, 480.0f)];
        [self addSubview:imageViews[0]];
        [self addSubview:imageViews[1]];
        [self addSubview:imageViews[2]];
        imageViews[0].image = [self imageFromResourcesWithName:[imagePaths objectAtIndex:0]];
        imageViews[1].image = [self imageFromResourcesWithName:[imagePaths objectAtIndex:1]];
        imageViews[2].image = [self imageFromResourcesWithName:[imagePaths objectAtIndex:2]];
        currentImage = 1;
        self.contentOffset = CGPointMake(320.0f*currentImage, .0f);
        self.contentSize = CGSizeMake(3.0f*320.0f, 480.0f);
        self.delegate = self;
        animationTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/60.0 target:self selector:@selector(scrollFragment) userInfo:nil repeats:YES];
    }
    return self;
}
- (void)repositionIfNeeded {
    CGFloat offsetX = self.contentOffset.x;
    NSInteger iCount = [imagePaths count];
    if(offsetX > 320.0f*1.75f) {
        self.contentOffset = CGPointMake(offsetX-320.0f, .0f);
        imageViews[0].image = imageViews[1].image;
        imageViews[1].image = imageViews[2].image;
        NSInteger imageToLoad = currentImage+2;
        if(imageToLoad>iCount-1)
            imageToLoad -= iCount;
        imageViews[2].image = [self imageFromResourcesWithName:[imagePaths objectAtIndex:imageToLoad]];
        currentImage++;
        if(currentImage>iCount-1)
            currentImage -= iCount;
    }
    else if(offsetX < 320.0f*.25f) {
        self.contentOffset = CGPointMake(offsetX+320.0f, .0f);
        imageViews[2].image = imageViews[1].image;
        imageViews[1].image = imageViews[0].image;
        NSInteger imageToLoad = currentImage-2;
        if(imageToLoad<0)
            imageToLoad += iCount;
        imageViews[0].image = [self imageFromResourcesWithName:[imagePaths objectAtIndex:imageToLoad]];
        currentImage--;
        if(currentImage<0)
            currentImage += iCount;
    }
}
- (void)scrollFragment {
    self.contentOffset = CGPointMake(self.contentOffset.x+1.0, .0f);
    [self repositionIfNeeded];
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    [self repositionIfNeeded];
}
- (void)dealloc {
    [imageViews[0] release];
    [imageViews[1] release];
    [imageViews[2] release];
    [imagePaths release];
}
@end