por - localiza el iphone
¿Cómo detecto la orientación en el inicio de la aplicación para la animación de la pantalla de bienvenida en el iPad? (9)
Hola, tengo una aplicación y tengo dos * .pngs para la pantalla de inicio predeterminada:
Default-Landscape.png Default-Portrait.png
Lo que quiero es animar esta pantalla de bienvenida predeterminada cuando mi aplicación esté cargada y lista para funcionar.
Para lograr esto, normalmente presentaría un UIImageView con el paisaje predeterminado o el retrato predeterminado (dependiendo de la orientación del dispositivo), lo mantendré en la pantalla durante un cierto tiempo y luego lo animaré.
Mi problema es que si llamo [[UIDevice currentDevice] orientation]
en
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
La respuesta siempre es que el dispositivo está en orientación vertical, incluso si lo tengo claramente en horizontal. Intenté esto en el simulador y también en el dispositivo y el comportamiento es el mismo.
¿Alguien sabe una solución para este o tal vez algún otro enfoque?
¡Gracias!
¿Tal vez podría mostrar una vista en blanco con fondo negro en la hora de inicio y colocar [[UIDevice currentDevice] orientation]
en la vista de vista de esta vista y viewDidAppear
desde allí la pantalla de inicio?
Ciertamente, hay ocasiones en las que desea hacer la transición de la imagen de carga a otra cosa antes de que el usuario obtenga el control de su aplicación. A menos que su aplicación sea realmente simple, pasar de cargar la imagen a la página de destino probablemente no será suficiente sin que la experiencia de la aplicación sea realmente desastrosa. Si alguna vez desarrolla una aplicación grande, definitivamente querrá hacer eso para mostrar el progreso durante la configuración, la carga de xibs, etc. Si una aplicación tarda varios segundos en prepararse sin comentarios, los usuarios la odiarán. En mi opinión, tampoco hay nada malo con un buen efecto de transición. Casi nadie usa las pantallas de carga como Apple sugiere. No sé qué aplicaciones miró que mostraban las pantallas de carga de tipo "UI vacía" que sugieren. Diablos, incluso Apple no lo hace, excepto en su código de muestra y ninguno de mis clientes lo encontraría aceptable. Es un diseño cojo.
Otra solución sería leer los datos del acelerómetro y determinar la orientación usted mismo.
Para saber al inicio cuál es la orientación (la orientación UIDevice
no funciona hasta que el usuario haya shouldAutorotateToInterfaceOrientation
el dispositivo), debe interceptarAutorotateToInterfaceOrientación de su View Controller, se llama al inicio y conoce la orientación de su dispositivo.
Para solucionar este problema, instalé la vista de imagen de bienvenida dentro de un controlador de vista que permitía ambas orientaciones. A pesar de que el dispositivo informó una orientación incorrecta en el inicio, el controlador de vista parece tener la correcta.
Parece que no estás usando la imagen de inicio como Apple recomienda en el HIG de iOS . Indica específicamente que no debe usarlo como pantalla de inicio, sino más bien como una versión básica de su interfaz de usuario real. El efecto neto es que su aplicación parece estar lista mucho más rápido.
Las sugerencias de que usted podría dibujar una pantalla de bienvenida después de que la aplicación se haya iniciado en viewDidAppear o similar también carecen del propósito básico de una imagen de inicio. No es una pantalla de bienvenida. Si su aplicación está lista, deje que el usuario interactúe con ella, no pierda el tiempo dibujando una pantalla de bienvenida.
Desde mi encuesta de cinco minutos de aplicaciones de Apple y aplicaciones de terceros, todos mostraron una imagen de lanzamiento vertical, cargaron la versión vertical de la interfaz de usuario y luego giraron a horizontal. Ha pasado un tiempo desde la programación en iOS, pero creo que esto refleja el orden de las llamadas de métodos: primero se inicia su aplicación, luego se le dice que gire a una orientación particular.
Aunque podría ser una buena solicitud de mejora para archivar con Apple :)
Puede usar UIApplication statusBarOrientation de la siguiente manera:
if ( UIDeviceOrientationIsLandscape( [[UIApplication sharedApplication] statusBarOrientation] ))
{
// landscape code
}
else
{
// portrait code
}
Solo la primera vista agregada a la ventana es girada por el sistema operativo. Entonces, si desea que la pantalla de bienvenida gire automáticamente Y su vista principal es giratoria, simplemente agréguela como elemento secundario de esa vista.
Aquí está mi código para desvanecer la imagen de la pantalla de inicio correspondiente:
// Determine which launch image file
NSString * launchImageName = @"Default.png";
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
if (UIDeviceOrientationIsPortrait([[UIDevice currentDevice] orientation])) {
launchImageName = @"Default-Portrait.png";
} else {
launchImageName = @"Default-Landscape.png";
}
}
// Create a fade out effect
UIImageView* whiteoutView = [[[UIImageView alloc] initWithFrame:self.window.frame] autorelease];
whiteoutView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
whiteoutView.autoresizesSubviews = YES;
whiteoutView.image = [UIImage imageNamed:launchImageName];
[[[self.window subviews] objectAtIndex:0] addSubview:whiteoutView];
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
whiteoutView.alpha = 0.0;
[UIView commitAnimations];
Nota: tendrás que actualizarlo para que sea compatible con pantallas de alta resolución.
Tuve problemas con esto y lo resolví haciendo una imagen 1024x1024 y configurando el modo de contenido de UIImageView en UIViewContentModeTop, y luego utilicé el margen automático del margen derecho e izquierdo. Siempre que sus imágenes predeterminadas de retrato y paisaje tengan el mismo diseño, esto funcionará bien.
Solo para aclarar esto es lo que usé:
bgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:SplashImage]];
bgView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
bgView.contentMode = UIViewContentModeTop;