2009-09-18 13 views
5

No he podido encontrar la respuesta para este problema que estoy teniendo.Center UIImageView inside UIScrollView without contentInset?

Tengo un UIImageView dentro de UIScrollView, y me gustaría que el centro tenga su contenido verticalmente.

En este momento, la única forma en que he podido hacer esto es configurando el contentInset de la vista de desplazamiento en función de la altura del tamaño del UIImageView, pero esta no es una solución perfecta; simplemente aumenta el tamaño de UIImageView, lo que hace que UIScrollView 'piense' que su contenido es más grande, y agrega estas barras negras a la parte superior.

He tratado de obtener ayuda de:

UIScrollView with centered UIImageView, like Photos app

y

Center content of UIScrollView when smaller

pero no han sido capaces de resolverlo usando esas respuestas.

+0

También estoy luchando por encontrar una solución para este. Parece que no hay una forma simple de centrar el contenido de un scrollView. – Jonah

+0

¿Ha sido respondida todavía? – JoePasq

Respuesta

1

Crear una UIView independiente y agregar el UIImageView centrada en esto, a continuación, añadir la vista al ScrollView

UIView *view = [[UIVIew alloc] initWithFrame:<frame that will fill your scrollview>]; 
CGRect frame = CGRectMake((view.size.width - IMAGE_WIDTH)/2, (view.size.height - IMAGE_HEIGHT)/2, IMAGE_WIDTH, IMAGE_HEIGHT); 
UIImageView *imageView = [[UIImageView alloc] initWithFrame:frame]; 
imageView.image = [UIImage imageNamed:@"imageSized_IMAGE_WIDTH_by_IMAGE_HEIGHT.png"]; 
[view addSubview:imageView]; 
[imageView release]; 

[scrollView addSubview:view]; 
[view release]; 

Tenga en cuenta que tendrá que establecer el marco de vista que las dimensiones y la ubicación que necesita en el scrollview. La parte importante a tener en cuenta es el centrado de la vista de la imagen dentro del marco de la vista utilizando las dimensiones de los marcos de la vista como variables.

+0

Esto funcionará más o menos. El problema es que si la imagen es más pequeña que UIView, se desplazará parcialmente fuera de la pantalla. La aplicación de fotos no permite esto y se ve mucho mejor. – Jonah

+1

Sí, he visto el problema del que habla Jonah en algunas aplicaciones. La ÚNICA aplicación que he visto capaz de hacer lo que queremos correctamente es Apple's Photos.app :(Hasta ahora, solo estoy centrando mi imagen dentro de una UIView que es entonces el tamaño de la imagen + cualquier inserto que necesito para que esté centrado en el interior UIScroolView. No es óptimo, ya que agrega barras negras en la parte superior e inferior. Se ve un poco mejor si elimino las barras de desplazamiento (como Photos.app) – runmad

4

Se puede decir que la UIScrollView para desplazarse a la vista específica llamando scrollRectToVisible:animated:

Ejemplo:

[myScrollView scrollRectToVisible:imageView.frame animated:YES]; 

para centrarlo verticalmente, intente esto:

1) Añadir una vista vacía a su scrollview que tiene la misma altura que tu contentSize.

2) Haz tu UIImageView al centro de la emptyView

2) scrollRectToVisible en este vacío vista.

+0

La captura de pantalla está rota – Besi

0

contentInset no debe cambiar el contentSize, debería cambiar el contentOffset.

Intenta configurar el contentSize, luego el contentInset. Consulte también el color de fondo de UIScrollView y lo que se puede mostrar detrás de él. No tengo problemas para centrar un UIImageView en UIScrollView usando setContentSize, setContentInset y addSubview.

1

Apple ha lanzado los videos de la sesión de WWDC 2010 a todos los miembros del programa de desarrollo de iphone.¡Uno de los temas discutidos es cómo crearon la aplicación de fotos! Construyen una aplicación muy similar paso a paso y han hecho todo el código disponible de forma gratuita.

Tampoco usa una API privada. No puedo poner aquí ningún código debido al acuerdo de no divulgación, pero aquí hay un enlace a la descarga del código de muestra. Probablemente necesites iniciar sesión para obtener acceso.

http://connect.apple.com/cgi-bin/WebObjects/MemberSite.woa/wa/getSoftware?code=y&source=x&bundleID=20645

Y, aquí hay un enlace a la página de iTunes WWDC:

http://insideapple.apple.com/redir/cbx-cgi.do?v=2&la=en&lc=&a=kGSol9sgPHP%2BtlWtLp%2BEP%2FnxnZarjWJglPBZRHd3oDbACudP51JNGS8KlsFgxZto9X%2BTsnqSbeUSWX0doe%2Fzv%2FN5XV55%2FomsyfRgFBysOnIVggO%2Fn2p%2BiweDK%2F%2FmsIXj

6

Este código debería funcionar en la mayoría de las versiones de IOS (y ha sido probado para trabajar en 3.1 hacia arriba, que es todo a lo que actualmente tengo acceso).

Se basa en el código WWDC de Apple mencionado en la respuesta de Jonah.

Añadir el siguiente a su subclase de UIScrollView, y reemplace tileContainerView con la vista que contiene la imagen o azulejos:

- (void)layoutSubviews { 
    [super layoutSubviews]; 

    // center the image as it becomes smaller than the size of the screen 
    CGSize boundsSize = self.bounds.size; 
    CGRect frameToCenter = tileContainerView.frame; 

    // center horizontally 
    if (frameToCenter.size.width < boundsSize.width) 
     frameToCenter.origin.x = (boundsSize.width - frameToCenter.size.width)/2; 
    else 
     frameToCenter.origin.x = 0; 

    // center vertically 
    if (frameToCenter.size.height < boundsSize.height) 
     frameToCenter.origin.y = (boundsSize.height - frameToCenter.size.height)/2; 
    else 
     frameToCenter.origin.y = 0; 

    tileContainerView.frame = frameToCenter; 
} 
+0

Estoy trabajando en una aplicación de iPad y quería centrar la imagen se muestra en DetailView. No subclass UIScrollView, en su lugar agregué este código a shouldAutorotateToInterfaceOrientation y ahora funciona bien tanto en modo horizontal como vertical. Gracias por compartir. – Sushant