Después de la rotation, las coorderadas UIView se intercambian, pero UIWindow no.

Usando Xcode 4.2.1 iPad iOS 5.0.1, cree un nuevo proyecto de iPad "Vista única". En el controller, agregue:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return YES; } - (void) dumpView: (UIView *) view { CGRect frame = view.frame ; CGRect bounds = view.bounds ; CGPoint center = view.center ; NSLog(@"view [%@]:%d frame=%@ bounds=%@ center=%@" , NSStringFromClass(view.class) , [view hash] , NSStringFromCGRect(frame) , NSStringFromCGRect(bounds) , NSStringFromCGPoint(center)) ; } - (void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation) fromInterfaceOrientation { NSLog(@"INViewController.didRotateFromInterfaceOrientation: %d to %d", fromInterfaceOrientation, self.interfaceOrientation) ; [self dumpView: self.view] ; [self dumpView: self.view.superview] ; } 

Ejecutalo, gira el dispositivo y obtendrás:

 INViewController.didRotateFromInterfaceOrientation: 2 to 4 view [UIView] bounds={{0, 0}, {1024, 748}} center={394, 512} view [UIWindow] bounds={{0, 0}, {768, 1024}} center={384, 512} 

En otras palabras, UIView tiene sus coorderadas "swapped to landscape" como se esperaba, pero su UIWindow padre todavía dice estar en modo vertical …

Además, el tamaño UIView parece estar un poco mal: la coorderada y que debe estar en 20 está en 0 …

Alguien sabe lo que esto significa?

El sistema de coorderadas de UIWindow está siempre en orientación vertical. Aplica la rotation configurando la transformación de la vista de rootViewController. Por ejemplo, creé una aplicación de testing con la plantilla de vista única y la ejecuté. En orientación vertical:

 (gdb) po [[(id)UIApp keyWindow] recursiveDescription] <UIWindow: 0x9626a90; frame = (0 0; 768 1024); layer = <UIWindowLayer: 0x9626b80>> | <UIView: 0x96290e0; frame = (0 20; 768 1004); autoresize = W+H; layer = <CALayer: 0x96286a0>> 

Después de girar a la izquierda:

 (gdb) po [[(id)UIApp keyWindow] recursiveDescription] <UIWindow: 0x9626a90; frame = (0 0; 768 1024); layer = <UIWindowLayer: 0x9626b80>> | <UIView: 0x96290e0; frame = (0 0; 748 1024); transform = [0, 1, -1, 0, 0, 0]; autoresize = W+H; layer = <CALayer: 0x96286a0>> 

Después de girar a la derecha:

 (gdb) po [[(id)UIApp keyWindow] recursiveDescription] <UIWindow: 0x9626a90; frame = (0 0; 768 1024); layer = <UIWindowLayer: 0x9626b80>> | <UIView: 0x96290e0; frame = (20 0; 748 1024); transform = [0, -1, 1, 0, 0, 0]; autoresize = W+H; layer = <CALayer: 0x96286a0>> 

Observe cómo se establece la transformación (en una matriz de rotation de 90 grados) cuando el dispositivo gira.

Con respecto a su pregunta sobre el tamaño de UIView: los límites de una vista están en su propio espacio de coorderadas y, por defecto, el origen de los límites de una vista está en el origen (0,0) de su espacio de coorderadas. El marco de una vista está en el espacio de coorderadas de su padre. Puede ver los 20 que esperaba en las descripciones recursivas anteriores, o al imprimir el marco directamente:

 (gdb) p (CGRect)[[[[(id)UIApp keyWindow] subviews] lastObject] frame] $2 = { origin = { x = 0, y = 20 }, size = { width = 768, height = 1004 } }