UIScrollView se desplaza demasiado lejos después del zoom inicial

Mi UIScrollView se llena con un gran contenido y luego se amplía con "setZoomScale: animated", de modo que encaja en el marco scrollview. La vista aparece correctamente ampliada y colocada correctamente en la vista de desplazamiento. Sin embargo, el usuario puede desplazarse fuera del contenido (se ve el color de background del scrollview). Parece que puede desplazarse hasta el tamaño de contenido original (como si el contenido no hubiera sido eliminado). Curiosamente, después de que el usuario amplía los zoom manualmente la primera vez, todo funciona bien, y la scrollview está restringida al tamaño del contenido nuevamente.

He buscado en la web y he revisado los documentos y ejemplos de Apple, pero no pude encontrar a alguien 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 es reemplazado por un CATiledLayer (como en los ejemplos de Apple). El dibujo que hago yo en drawLayer: inContext :.

Aquí hay un fragment 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 instrucción NSLog muestra una configuration correcta de contentSize y zoomscale …

Esperando que haya algo obvio que me falta …

    Terminé de configurar el zoomScale en el próximo runloop (en lugar de directamente desde loadView), que funcionó:

     - (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 escala de zoom de viewDidAppear, en lugar de LoadView. Ese enfoque tiene la ventaja añadida de que muestra una animation 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]; } 

    Soy nuevo en esto, pero podrías probar subtítulos. Creé una vista de desplazamiento con el creador de la interfaz, y allí en el inspector de attributes había un subpantalla de los cuadros de verificación, así que creo que deberías hacer algo así, solo mediante progtwigción. Espero que ayude.