2012-07-09 17 views
5

I tienen un guión con 1 UIViewController, sosteniendo 1 UIView que contiene un número de anidados UIView s. Me subclases el controlador de vista para poner en práctica este método:UIView tiene dimensiones retrato, mientras que en el paisaje?

- (BOOL)shouldAutorotateToInterfaceOrientation: UIInterfaceOrientation)interfaceOrientation { 
    return (interfaceOrientation == UIInterfaceOrientationLandscapeRight || interfaceOrientation == UIInterfaceOrientationLandscapeLeft); 
} 

También he añadido

<key>UISupportedInterfaceOrientations</key> 
    <array> 
    <string>UIInterfaceOrientationLandscapeLeft</string> 
    <string>UIInterfaceOrientationLandscapeRight</string> 
    </array> 
<key>UIInterfaceOrientation</key> 
<string>UIInterfaceOrientationLandscapeLeft</string> 

a la Info.plist.

En el viewDidLoad de la UIView principal por la que estoy haciendo esto:

El problema es el control sólo es 756px de ancho en lugar de la esperada 1024. Ver la pantalla de abajo para más detalles. enter image description here He estado buscando por toda la web, pero no puedo encontrar una solución a este problema frustrante en cualquier lugar. Estoy usando Xcode 4.5 con iOS5.1 establecido como base SDK.

EDIT Está trabajando reemplazando el marco por límites. Sin embargo, no entiendo lo que está sucediendo, así que no está funcionando con el tamaño del marco.

Respuesta

11

El rectángulo marco, que describe ubicación y el tamaño de la vista en el sistema de coordenadas de su supervista.

@property (no atómica) marco CGRect

y

El rectángulo límites, que describe ubicación y el tamaño de la vista en su propio sistema de de coordenadas.

@property (no atómica) CGRect limita

Use límites, no marco.

+0

¡Gracias! ¡Reemplazar 'frame' con límites funciona! Sin embargo, realmente no entiendo por qué? ¿Alguna posibilidad de hacerlo funcionar con frame? No entiendo por qué el tamaño de la UIView es diferente en la supervista y en su propio sistema de coordenadas – s1m0n

+0

Según tengo entendido, eso sucede porque la vista se encuentra en la ventana y esa ventana debe tener un modo de paisaje interno, si eso está cerca de ser cierto, las coordenadas de vista en el sistema de coordenadas de la ventana no reflejan la rotación ya que la ventana se gira junto con su vista y su vista secundaria. Es posible que desee actualizar el conocimiento del sistema de coordenadas para una mejor comprensión (la rotación y tal vez la transición deben ser suficientes para este caso): http://en.wikipedia.org/wiki/Cartesian_coordinate_system Eso es una matemática escolar como lo recuerdo. –

+1

Probablemente valga la pena leer a través de http://stackoverflow.com/questions/1210047/iphone-development-whats-the-difference-between-the-frame-and-the-bounds, y algunas de las preguntas vinculadas. –

2

Establecer la autoresizingMask a cualquier vistas desea AUTORESIZE en rotación. De esta manera:

[myView setAutoresizingMask:UIViewAutoresizingMaskFlexibleWidth | UIViewAutoresizingMaskFlexibleRightMargin]; 
+1

Gracias por la respuesta. Pero no estoy tratando de permitir que mi aplicación se autorrotee o algo así. El modo paisaje es suficiente para mí. Por lo tanto, no debe autorrotar o lo que sea, solo quiero que devuelva las dimensiones de paisaje correctas. – s1m0n

0

El problema se debe a que antes de cargarlos en modo horizontal tus líneas de código está llamando el método de carga en cuyo procedimiento se le llama a esta [PASectionView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, 180)]; [self addSubview:sectionView]; si se trata de vista de clase controlador entonces debería ser [PASectionView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 180)]; [self addSubview:sectionView]; si es subclase de UIView entonces ¿de dónde sacaste el método ViewDidLoad. Ahora para resolver su problema en .h clase: escribir este PASectionView * sectionView; en .m clase implementar este método

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{ 
    if (toInterfaceOrientation == UIInterfaceOrientationPortrait) 
{ 

} 
else // OrientationLandscape 
{ 
sectionView.frame = CGRect(sectionView.frame.origin.x,sectionView.frame.origin.y,self.view.frame.size.width,180);  
} 
0

usted tiene que fijar la máscara de cambio de tamaño automático para la subvista,

Añadir esta línea de código antes de añadir la subvista a la supervista, si su subvista se añade por código. yourSubView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

else si su subvista se agregó en el archivo de punta, seleccione los imanes de borde y máscaras de cambio de tamaño en las propiedades de su subView en el archivo de punta.

Cuestiones relacionadas