2010-07-11 13 views
7

Tengo un ejemplo muy simple UIScrollView que simplemente no hace lo que se supone que debe hacer. No estoy seguro si es un error con la API o un error en mi código.UIScrollView no obtener un nuevo tamaño en la orientación cambiar

Básicamente, tengo un UIViewController con un UIScrollView como se ve. Cuando lo agrego al UIWindow y cambio la orientación del iPad, cierro el tamaño del UIScrollView s, que se informa incorrectamente (?).

Aquí es mi UIViewController aplicación:

@implementation CustomViewController 
- (void)loadView { 
    scrollView = [[[UIScrollView alloc] init] autorelease]; 
    scrollView.delegate = self; 
    scrollView.backgroundColor = [UIColor redColor]; 
    self.view = scrollView; 
} 

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    CGSize rect = scrollView.frame.size; 
    NSLog(@"will rotate w%f h%f", rect.width, rect.height); 
} 

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    CGSize rect = scrollView.frame.size; 
    NSLog(@"will animate rotation w%f h%f", rect.width, rect.height); 
} 

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { 
    CGSize rect = scrollView.frame.size; 
    NSLog(@"did rotate w%f h%f", rect.width, rect.height); 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return YES; 
} 

@end 

Cuando ejecuto el código anterior Veo las siguientes entradas en mi consola:

2010-07-11 11:03:05.214 Untitled2[6682:207] will rotate w768.000000 h1004.000000 
2010-07-11 11:03:05.214 Untitled2[6682:207] will animate rotation w748.000000 h1024.000000 
2010-07-11 11:03:05.619 Untitled2[6682:207] did rotate w748.000000 h1024.000000 
2010-07-11 11:03:07.951 Untitled2[6682:207] will rotate w748.000000 h1024.000000 
2010-07-11 11:03:07.958 Untitled2[6682:207] will animate rotation w768.000000 h1004.000000 
2010-07-11 11:03:08.367 Untitled2[6682:207] did rotate w768.000000 h1004.000000 

Como se puede ver, los cambios de orientación qué cambiar el tamaño de la UIScrollView , pero solo para permitir la nueva barra de estado. Esperaría que el ancho y la altura cambien drásticamente, ya que el UIScrollView es más ancho que alto y viceversa.

¿Hay alguna manera de obtener el UIScrollView para informar que es de tamaño real?

Respuesta

3

Tengo la respuesta si todavía estás buscando. Pruebe los límites , no el marco.

Motivo: el marco es una propiedad derivada de los límites y de la transformación que se aplica para la rotación.

+0

Esto no está funcionando. Intercepto un cambio, luego uso NSStringFromRect (self.bounds) e imprime los límites "antes de cambiar". Pero la orientación actual del dispositivo devuelve el valor correcto. Al menos, eso consistentemente devuelve la misma cosa correctamente, pero hombre ... este problema no debería llevar tanto tiempo. Desde los documentos, mientras que los límites son los no derivados, ¿no es siempre 0,0, igual que el ancho del cuadro, igual que la altura del cuadro? –

+0

El origen de los límites siempre es 0,0 por defecto a menos que esté cambiando la parte de la vista que desea visualizar. Eso es solo la mitad de la historia, un CGRect también contiene un miembro de tamaño y eso es lo que generalmente cambia al cambiar el tamaño, reorientar una vista. Las funciones de "voluntad" anteriores le dan los "valores anteriores", las funciones "sí" le dan los "valores posteriores". –

2

Las vistas no se redimensionarán automáticamente cuando cambien el tamaño de las superviews a menos que las configure específicamente. Para esa vista de desplazamiento necesitaría decirle que cambie el tamaño de su ancho y alto cuando lo haga su supervista.

scrollView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 
+0

Desafortunadamente después de añadir una máscara de cambio de tamaño sigo teniendo las dimensiones no válidas que regresan. Visualmente todo está bien, pero no puedo confiar en las dimensiones del marco. Lo he pirateado detectando la orientación de los dispositivos y volteando el ancho y la altura en el paisaje, no es ideal, pero funciona. – d2kagw

+0

Debe probar la orientación de [[UIDevice currentDevice]] y ver esto: UIDeviceOrienationIsPortrait() o similar para probarlo. El marco será incorrecto, pero informará la orientación correcta. Es molesto, estoy lidiando con eso ahora, pero me alegro de que algo sea sólido. Tal vez la respuesta de límites me ayude a autoescribir mi UIScrollView, pero el mío es offkilter incluso después de cambiar manualmente la orientación matemática para que coincida con –

1

me he dado cuenta de que la determinación de la nueva contentSize en didRotateFromInterfaceOrientation también es imposible si se empieza con un archivo de iPhone SEMILLA lugar de un archivo IPAD SEMILLA dedicado: los cuadros en el archivo iPhone SEMILLA son mucho más pequeñas y por lo tanto la La altura calculada del contenido se vuelve mucho mayor de lo que debería ser cuando en realidad está en un iPad. Apple DID decir que DEBO crear un archivo NIB para iPad por separado ...

Así que, también obtengo las dimensiones antiguas en didRotateFromInterfaceOrientation, pero para mí ahora es un problema menor, ya que iOS maneja todo OK una vez que comenzar con el archivo NIB correcto. Aún así, me parece menos intuitivo que en el método didRotateFromInterfaceOrientation las dimensiones del marco son incorrectas para la vista actual.

PS. Encontré una solución al final, solo use las notificaciones en lugar de didRotateFromInterfaceOrientation.

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 
     [[NSNotificationCenter defaultCenter] addObserver:self 
               selector:@selector(orientationChanged:) 
               name:UIDeviceOrientationDidChangeNotification 
               object:nil]; 

Luego, en el método orientationChanged, ajustar los puntos de vista a los nuevos marcos. Tuve un problema final: si la orientación inicial era diferente de la orientación en la punta, la vista seguiría siendo incorrecta, lo resolví creando un nuevo archivo NIB especialmente para la vista de paisaje. En el método init, el ViewController elige qué NIB carga en función de la orientación actual.

0

Normalmente lo soluciono estableciendo un valor de contentSize en 0 como CGSizeMake(contentSize.width, 0) para la vista horizontal.

Forzar UIScrollView para desplazarse solo, p. horizontal establece el valor no desplazable para contentSize a 0>CGSizeMake(contentSize.width, 0).

Espero que ayude.

0

No sé su ayuda usted porque nunca probado esto, pero yo creo que puede ser ayuda que

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
self.view = scrollView; 
CGSize rect = scrollView.frame.size; 
NSLog(@"will rotate w%f h%f", rect.width, rect.height); 
} 

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
self.view = scrollView;  
CGSize rect = scrollView.frame.size; 
NSLog(@"will animate rotation w%f h%f", rect.width, rect.height); 
} 

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { 
self.view = scrollView; 
CGSize rect = scrollView.frame.size; 
NSLog(@"did rotate w%f h%f", rect.width, rect.height); 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
return YES; 
} 
Cuestiones relacionadas