2011-09-05 20 views
5

Mi UIScrollView se completa con un gran contenido y luego se amplía con "setZoomScale: animado", de modo que se ajuste al marco de desplazamiento de vista. La vista aparece correctamente alejada y posicionada correctamente en la vista de desplazamiento. Sin embargo, el usuario puede desplazarse fuera del contenido (se muestra el color de fondo de la vista de desplazamiento). Parece que puede desplazarse hasta el tamaño del contenido original (como si el contenido no hubiera sido alejamiento). Por extraño que parezca, después de que el usuario hace zoom manualmente la primera vez, todo funciona bien, y la vista de desplazamiento está restringida al tamaño del contenido de nuevo.UIScrollView se desplaza demasiado después del zoom inicial

He buscado en la web, he revisado los documentos y ejemplos de Apple, pero no he podido encontrar a nadie que tenga el mismo problema. Los ejemplos de Apple parecen mostrar lo mismo que yo.

Mi contenido es una vista personalizada que se deriva de UIView, y cuyo CALayer se reemplaza por un CATiledLayer (como en los ejemplos de Apple). El dibujo lo hago yo mismo en drawLayer: inContext :.

Aquí es un fragmento de código de MyScrollViewController:

- (void)loadView { 
    CGRect frame = [UIScreen mainScreen].applicationFrame; 
    UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:frame]; 
    scrollView.maximumZoomScale=1.0; 
    scrollView.delegate = self; 

    ... setup theContentView ... 

    scrollView.contentSize = theContentView.bounds.size; 
    scrollView.contentInset = UIEdgeInsetsMake(20, 20, 20, 20); 
    [scrollView addSubview:theContentView]; 
    self.view = scrollView; 

    double zoomScale = 0.5; // hardcoded for testing 
    [scrollView setZoomScale:zoomScale animated:NO]; 
NSLog(@"zoomscale=%g contentview=%@ contentsize=%@", zoomScale, NSStringFromCGSize(theContentView.bounds.size), NSStringFromCGSize(scrollView.contentSize)); 

    [scrollView release]; 
} 

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView 
{ 
    return theContentView; 
} 

La declaración NSLog muestra un conjunto correctamente contentSize y zoomscale ...

esperando que hay algo obvio que me falta ...

+0

¿Alguien ha tenido una solución para esto? tengo el mismo problema, al revés. Mi vista de desplazamiento es pequeña para mostrar la imagen contenida (no puedo desplazarme hacia la parte inferior de la imagen) pero después de hacer zoom una vez todo está bien. – Maverick1st

+1

Terminé configurando el zoomScale en el próximo runloop (en lugar de directamente desde loadView), que funcionó: "[self performSelector: @selector (initialZoom) withObject: nil afterDelay: 0];". Pero reescribí muchas otras cosas también, así que no estoy seguro de si eso es lo único que se necesita. – fishinear

+0

Finalmente tuve la misma idea y funciona perfectamente. Una ventaja que obtienes al configurar la escala de zoom en viewDidAppear es que el usuario ve un zoom animado y, por lo tanto, sabe que la imagen que ve es zoomable :) – Maverick1st

Respuesta

3

que terminó estableciendo el zoomScale en la siguiente runloop (en lugar de directamente de loadView), que trabajó:

- (void) loadView { 
    CGRect frame = [UIScreen mainScreen].applicationFrame; 
    UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:frame]; 
    scrollView.maximumZoomScale=1.0; 
    scrollView.delegate = self; 

    ... setup theContentView ... 

    scrollView.contentSize = theContentView.bounds.size; 
    scrollView.contentInset = UIEdgeInsetsMake(20, 20, 20, 20); 
    [scrollView addSubview:theContentView]; 
    self.view = scrollView; 

    // set the zoom level on the next runloop invocation 
    [self performSelector:@selector(initialZoom) withObject:nil afterDelay:0]; 

    [scrollView release]; 
} 

- (void) initialZoom { 
    double zoomScale = 0.5; // hardcoded for testing 
    UIScrollView *scrollView = (UIScrollView *) self.view; 
    [scrollView setZoomScale:zoomScale animated:NO]; 
} 

Otra posibilidad, sugerida por Maverick1st, es establecer la zoomscale de viewDidAppear, en lugar de loadView . Ese enfoque tiene la ventaja adicional de que muestra una animación del zoom, que indica al usuario que la vista comienza en un estado de zoom.

- (void) viewDidAppear { 
    double zoomScale = 0.5; // hardcoded for testing 
    UIScrollView *scrollView = (UIScrollView *) self.view; 
    [scrollView setZoomScale:zoomScale animated:YES]; 
} 
1

Soy nuevo en esto, pero podría intentar clipping de subvistas. Creé una vista de desplazamiento con el constructor de interfaz, y allí en los atributos el inspector era una subcláusula de selección de clip, así que creo que debería hacer algo así, solo programáticamente. Espero que ayude.

Cuestiones relacionadas