novedades - ios 12 lanzamiento
¿Por qué en iOS 8 mi aplicación en el lanzamiento toma una orientación errónea? (8)
mi aplicación hasta iOS 7 funciona correctamente. Lo intenté hoy con Xcode 6 y cuando lo ejecuto tengo una desagradable sorpresa :(:
Puedes ver que Xcode ahora dibuja mi viewController como si estuviera en modo vertical, pero como puedes ver está en modo horizontal.
¿Sabes lo que ha cambiado en iOS 8? : / Usé los siguientes métodos de orientación:
- (NSUInteger) supportedInterfaceOrientations
- (BOOL) shouldAutorotate
- (BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation
EDITAR:
Acabo de descubrir este método:
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
return UIInterfaceOrientationMaskLandscape;
}
Y ahora mi primer viewcontrollers funciona correctamente :). el problema es cuando muestro un modal (que cambia el conjunto de métodos en UIInterfaceOrientationMaskAll) rehago el efecto feo de la captura de pantalla. Precisamente cambio mis métodos en este modo:
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
if(self.restrictRotation)
{
return UIInterfaceOrientationMaskLandscape;
}
else
{
return UIInterfaceOrientationMaskAll;
}
}
// THIS IS A DELEGATE OF MODAL VIEW CONTROLLER
- (void)updateInterfaceAfterDocumentPreviewViewController
{
NSLog(@"updateInterfaceAfterDocumentPreviewViewController");
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft];
AppDelegate* appDelegate = (AppDelegate*)[UIApplication sharedApplication].delegate;
appDelegate.restrictRotation = YES;
}
Por favor prueba el siguiente código
En el didFinishLaunchingWithOptions
de AppDelegate
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
[self.window setFrame:[[UIScreen mainScreen] bounds]]; //Add
El problema parece ser el orden de las llamadas cuando configura la ventana. makeKeyAndVisible
llamar a makeKeyAndVisible
antes de asignar el rootViewController
en su método didFinishLaunchingWithOptions
en el delegado de la aplicación. Los siguientes trabajos:
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
[self.window makeKeyAndVisible];
self.window.rootViewController = self.myMainViewController;
Pero si cambia el orden a:
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.rootViewController = self.myMainViewController;
[self.window makeKeyAndVisible];
Obtienes el comportamiento que estás experimentando.
Solución de Oldschool:
BOOL portrait;
BOOL iOS8OrLater = ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0);
if (iOS8OrLater) {
CGFloat height = CGRectGetHeight(self.view.frame);
CGFloat width = CGRectGetWidth(self.view.frame);
if (width / height > 1.0) {
portrait = NO;
} else {
portrait = YES;
}
} else {
portrait = UIInterfaceOrientationIsPortrait(self.interfaceOrientation);
}
if(portrait) {
[self layoutPortrait];
} else {
[self layoutLandscape];
}
Puede llamar esto en viewWillLayoutSubviews
UIInterfaceOrientation currentOrientation = [UIApplication sharedApplication].statusBarOrientation;
if( UIDeviceOrientationIsLandscape( currentOrientation ) )
{
if( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad )
{
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait];
// -- Fix for rotation issue for ios 8
if( IS_IOS_8_OR_LATER )
{
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPad"
bundle: nil];
// -- Set frame of nav controller
UINavigationController *nc = [storyboard instantiateViewControllerWithIdentifier:@"NavController"];
self.window.rootViewController = nc;
[self.window setFrame:[[UIScreen mainScreen] bounds]];
// -- Set fame of home view controller
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"Home"];
self.window.rootViewController = vc;
[self.window makeKeyAndVisible];
[self.window setFrame:[[UIScreen mainScreen] bounds]];
}
}
}
Eche un vistazo a su archivo .plist.
- Asegúrese de que tiene configurada la "Orientación inicial de la interfaz" como la orientación que deseaba.
- En las "orientaciones de interfaz compatibles", tenga la orientación preferida como la primera entrada en la lista (parece que Apple cambió este orden).
Ese enfoque para detectar la orientación estaba en desuso en iOS8 (pero todavía está permitido por ahora). Fue reemplazado con el concepto de Clases de Tamaño y Colecciones de Rasgos .
(Extrañamente, parece que no puedo encontrar una referencia de clase de tamaño en los documentos de Apple en línea en este momento - juraría que estaba allí antes, tal vez en XCode). Mira aquí los videos de WWDC.
De todos modos, hay una casilla de verificación en Interface Builder que dice " Usar clases de tamaño ". Podría ser que lo haya verificado. Apágalo y mira si eso ayuda?
Estaba teniendo un problema similar, no podía obtener el lanzamiento correcto de imágenes para mostrar (tenía dos para iPad, Default-Portrait.png y Default-Landscape.png) y tampoco podía hacer que la aplicación se orientara automáticamente después de que Launch Image desapareció.
Para resolver el problema de las imágenes de lanzamiento:
- Vaya a la sección Propiedades del destino de iOS personalizado del proyecto (haga clic en el icono de su proyecto en la parte superior de la lista de archivos del proyecto, y debería ser la primera sección que vea).
- Agregue una fila a esa tabla llamada "Iniciar imagen" (debe rellenar automáticamente) e ingrese "Predeterminado" como la cadena en la columna de la derecha.
- Asegúrate de que las imágenes de inicio sigan las pautas del nombre de archivo de Apple (es decir: Predeterminado-568 @ 2x, Predeterminado @ 2x, etc.) revisa esta respuesta SO
Para resolver el problema de orientación de la aplicación al principio ViewController:
- Vaya a su archivo plist de proyectos (debe ser "YourApp-Info.plist")
- Agregue una fila e ingrese "Orientaciones de interfaz compatibles"
- Agregue las orientaciones que admite su aplicación
Tuve el mismo problema exacto con una "pantalla de carga". Esto es lo que funcionó para mí. ( Nota: mi aplicación solo es compatible con iOS 7 o posterior, modo paisaje ):
CGRect theFrame = self.view.frame;
if ([[[UIDevice currentDevice] systemVersion] floatValue] < 8.0) {
CGRect screenBounds = [[UIScreen mainScreen] bounds];
theFrame.origin = CGPointZero;
theFrame.size.width = screenBounds.size.height;
theFrame.size.height = screenBounds.size.width;
}
NSLog(@"%@", [NSNumber valueWithCGRect:theFrame]);
self.loadingScreen = [[UIView alloc] initWithFrame:theFrame];
Consulte la respuesta de Mike Hay si su aplicación admite la orientación vertical y la "forma larga de calcular el marco de aplicación correcto": https://.com/a/18072095/4108485
Espero que esto ayude.