descargar - Aplicación de plantilla de utilidad de paisaje de iPhone solamente
ios 12 (3)
Intento crear una aplicación para iPhone que siempre esté en modo horizontal, usando la plantilla de la aplicación Utility. Esto es lo que hice:
- Cree un nuevo proyecto de aplicación de iPhone utilizando la plantilla de aplicación de utilidad
- En Interface Builder, rota todas las vistas 90 grados.
- En Interface Builder, agregue una etiqueta al medio de MainView. Extiéndalo a lo largo de toda la vista, establezca la alineación en el centro y establezca los resortes de autoescalado para que se pueda estirar horizontalmente.
- En Info.plist, agregue la clave "UIInterfaceOrientation" con el valor "UIInterfaceOrientationLandscapeRight"
- En las clases de controlador, cambie los métodos shouldAutorotateToInterfaceOrientation a "return (interfaceOrientation == UIInterfaceOrientationLandscapeRight) || (interfaceOrientation == UIInterfaceOrientationLandscapeLeft);"
- Ejecuta la aplicación.
Cuando inicio mi aplicación, aparece en orientación horizontal, pero la vista principal solo cubre la mitad superior de la pantalla y se estira horizontalmente. Obtengo los mismos resultados tanto en el simulador como en un dispositivo real. Lo he visto con las versiones 2.2 y 2.2.1 del SDK.
He podido solucionar el problema agregando el siguiente paso a lo anterior:
- Agregue "self.view.autoresizesSubviews = NO;" al método viewDidLoad de RootViewController después de "[super viewDidLoad];".
Si hago esto, entonces funciona como se esperaba. Pero esto se siente como un truco. ¿Por qué debería ser esto necesario?
No creo que sea un problema de transformación. Todos los elementos se dibujan en la orientación adecuada y con la escala adecuada. El problema parece ser que los rectángulos de límites de la vista principal se vuelven funky. Parece que la altura de la vista principal se está reduciendo en un poco más de la mitad, y el ancho se está incrementando en aproximadamente un 50%.
Si realizo exactamente el mismo conjunto de pasos usando la plantilla de la Aplicación basada en Vista en lugar de la Utilidad, todo funciona como se espera. Así que estoy bastante seguro de que el problema es específico de cómo una aplicación de utilidad administra sus vistas.
¿Alguien entiende lo que está pasando aquí?
Intente establecer la propiedad de orientación de la vista en Horizontal en el plumín. Esta propiedad se puede encontrar en la cuarta pestaña [Attributes Inspector] de la Vista de información de UIView en Simulated Metrices.
Jane describe la configuración de UIInterfaceOrientation para UIInterfaceOrientationLandscapeRight (o UIInterfaceOrientationLandscapeLeft) y la configuración de rotación recomendada en la documentación, pero utilicé un bloque de código ligeramente diferente (con el mismo fin) en mi controlador de vista raíz:
- (void)loadView
{
UIView *primaryView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
primaryView.backgroundColor = [UIColor clearColor];
// Start in landscape orientation, and stay that way
UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
if (orientation == UIInterfaceOrientationLandscapeRight)
{
CGAffineTransform transform = primaryView.transform;
// Use the status bar frame to determine the center point of the window''s content area.
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
CGRect bounds = CGRectMake(0, 0, statusBarFrame.size.height, statusBarFrame.origin.x);
CGPoint center = CGPointMake(60.0, bounds.size.height / 2.0);
// Set the center point of the view to the center point of the window''s content area.
primaryView.center = center;
// Rotate the view 90 degrees around its new center point.
transform = CGAffineTransformRotate(transform, (M_PI / 2.0));
primaryView.transform = transform;
}
self.view = primaryView;
[primaryView release];
}
Además de eso, implementé el siguiente método delegado en mi controlador de vista raíz:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return ( (interfaceOrientation == UIInterfaceOrientationLandscapeLeft) || (interfaceOrientation == UIInterfaceOrientationLandscapeRight));
}
Finalmente, me encontré con problemas técnicos extraños con el simulador que no giraba automáticamente, así que necesitaba implementar el siguiente método de delegado en mi UIApplicationDelegate:
- (void)application:(UIApplication *)application willChangeStatusBarOrientation:(UIInterfaceOrientation)newStatusBarOrientation duration:(NSTimeInterval)duration;
{
// This prevents the view from autorotating to portrait in the simulator
if ((newStatusBarOrientation == UIInterfaceOrientationPortrait) || (newStatusBarOrientation == UIInterfaceOrientationPortraitUpsideDown))
[application setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:NO];
}
Después de todo eso, mi aplicación pudo comenzar en el paisaje (derecha) y mantenerse en esa orientación bajo el firmware 2.0 y en el simulador.
Iba a decir que establecer esta clave no rota su interfaz; aún necesita diseñar su contenido en modo horizontal y hacer la rotación adecuada usando CFAffineTransform; consulte "Iniciar en modo horizontal" en la Guía de programación de iPhone OS. Para encontrar la referencia para ti, encontré este comentario: "Para iniciar una aplicación basada en controlador de vista en modo horizontal en las versiones de iPhone OS anteriores a la v2.1, debes aplicar una rotación de 90 grados a la transformación de la aplicación. vista de raíz además de todos los pasos anteriores. Antes de iPhone OS 2.1, los controladores de vista no giraban automáticamente sus vistas en función del valor de la clave UIInterfaceOrientation. Sin embargo, este paso no es necesario en iPhone OS 2.1 y versiones posteriores ".
Entonces, si está ejecutando pre-2.1, necesita agregar este código a su método viewDidLoad en su controlador de vista. (De lo contrario, ¿puedes publicar algún código?)
-(void)viewDidLoad
// After loading the view, transform the view so that the co-ordinates are right for landscape
// As described in iPhone Application Programming Guide
// Weird, I''m sure this used to be needed, but it doesn''t now. The one in CardScrollViewController is needed though.
{
[super viewDidLoad];
CGAffineTransform transform = self.view.transform;
CGPoint center = CGPointMake(kScreenHeight / 2.0, kScreenWidth / 2.0);
// Set the center point of the view to the center point of the window''s content area.
self.view.center = center;
// Rotate the view 90 degrees around its new center point.
transform = CGAffineTransformRotate(transform, (M_PI / 2.0));
self.view.transform = transform;
}