2009-09-05 9 views
8

Duplicar posible:
UIScrollView. Any thoughts on implementing “infinite” scroll/zoom?Loop un UIScrollView

tengo una UIScrollView y en él diferentes imágenes (alrededor de 30). Me gustaría hacerlo posible, cuando el usuario llegue a la última imagen para mostrar la primera después de ella, y así sucesivamente. Y quiero implementar la misma característica con la primera imagen (para ir al último). Me gustaría recorrer las imágenes sin problemas para que el usuario ni siquiera note que está haciendo otro ciclo.

¿Cuál es la mejor manera de lograr esto?

Gracias.

+1

Una mejor forma de describirlo sería * circular * (IMO). – mk12

Respuesta

24

Acabo de hacer esto. Tengo una serie de imágenes para agregar a la vista de desplazamiento, así que primero agrego la última a la vista de desplazamiento, luego ejecuto la matriz para agregar todas las imágenes y luego, agrego la primera de la matriz nuevamente.

echar un vistazo a este código:

#import "MainViewController.h" 
#import "MainView.h" 

#define WIDTH_OF_SCROLL_PAGE 320 
#define HEIGHT_OF_SCROLL_PAGE 352 
#define WIDTH_OF_IMAGE 320 
#define HEIGHT_OF_IMAGE 352 
#define LEFT_EDGE_OFSET 0 

@implementation MainViewController 

@synthesize scrollView, slideImages; 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad { 
    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:@"welcome-small.jpg"]; 
    [slideImages addObject:@"football-small.jpg"]; 
    [slideImages addObject:@"dancing-small.jpg"]; 
    [slideImages addObject:@"celebration-small.jpg"]; 

    //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.view addSubview:scrollView]; 
    [self.scrollView scrollRectToVisible:CGRectMake(WIDTH_OF_IMAGE,0,WIDTH_OF_IMAGE,HEIGHT_OF_IMAGE) animated:NO]; 
    [super viewDidLoad]; 
} 

- (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)) { 
     [self.scrollView scrollRectToVisible:CGRectMake(WIDTH_OF_IMAGE,0,WIDTH_OF_IMAGE,HEIGHT_OF_IMAGE) animated:NO]; 
    } 
} 


- (void)didReceiveMemoryWarning { 
    // Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 

    // Release any cached data, images, etc that aren't in use. 
} 

- (void)viewDidUnload { 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
} 


- (void)dealloc { 
    [scrollView release]; 
    [slideImages release]; 
    [super dealloc]; 
} 


@end 

Luego utilizo scrollViewDidEndDecelerating para comprobar en qué lugar del desplazamiento, el usuario es, y luego saltar a la segunda imagen o pasado, pero la imagen 1 para que puedan desplazarse de forma continua ... Lo siento si no lo he explicado bien, ¡falta de tiempo! Pero este código funciona bien para mí en el dispositivo ..

+1

La línea que dice: 'imageView.frame = CGRectMake ((WIDTH_OF_IMAGE * i) + LEFT_EDGE_OFSET + 320, 0, WIDTH_OF_IMAGE, HEIGHT_OF_IMAGE);' debe cambiar a: 'imageView.frame = CGRectMake ((WIDTH_OF_IMAGE * i) + LEFT_EDGE_OFSET + WIDTH_OF_IMAGE, 0, WIDTH_OF_IMAGE, HEIGHT_OF_IMAGE); ' – mattorb

+1

¡Hola Craig! Muchas gracias por tu código. Estoy tratando de hacer algo similar a esto, pero en lugar de tener la vista de desplazamiento del tamaño de una imagen única, me gustaría ver varias imágenes (por ejemplo, 3) en la vista de desplazamiento. ¿Cómo hacer eso? ¿¿Me puedes ayudar?? Gracias – Frade

Cuestiones relacionadas