iOS 8 Métodos de Rotación Obsoleto-Compatibilidad con Versiones Anteriores


En iOS 8, los métodos para la rotación de la interfaz son obsoletos. Esto incluye:

  • willRotateToInterfaceOrientation:duration:
  • didRotateFromInterfaceOrientation:
  • willAnimateRotationToInterfaceOrientation:duration:

Los métodos de reemplazo incluyen:

  • willTransitionToTraitCollection:withTransitionCoordinator:
  • viewWillTransitionToSize:withTransitionCoordinator:

Si los nuevos métodos de rotación no se implementan, y un proyecto se compila con el SDK de iOS 8, los controladores de vista- no recibirán llamadas- a los métodos de rotación obsoletos.

Mi preocupación es la siguiente: ¿sucede a una aplicación que ya está en la AppStore creada con el SDK de iOS 7? ¿Los métodos de rotación obsoletos todavía se pueden llamar en un dispositivo iOS 8 o no?

EDITAR:

Los métodos de rotación todavía se llaman, pero existen algunos cambios/problemas/errores en iOS 8.

También UIScreen ahora está orientado a la interfaz

Author: Community, 2014-08-11

6 answers

Los métodos de rotación están obsoletos en el SDK de iOS 8. Esto no tendrá ningún efecto en las aplicaciones creadas con el SDK de iOS 7, incluso ejecutándose en iOS 8 y probablemente varias versiones futuras de iOS.

Como ejemplo, la propiedad font de UIButton ha quedado obsoleta desde iOS 3.0 y todavía está disponible en iOS 7.0.

 19
Author: mluisbrown,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-14 10:23:33

Acabo de tener este problema y quería usar los mismos métodos que estaba usando antes (al menos por ahora), así que esto es lo que hice.

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];

    //The device has already rotated, that's why this method is being called.
    UIInterfaceOrientation toOrientation   = [[UIDevice currentDevice] orientation];
    //fixes orientation mismatch (between UIDeviceOrientation and UIInterfaceOrientation)
    if (toOrientation == UIInterfaceOrientationLandscapeRight) toOrientation = UIInterfaceOrientationLandscapeLeft;
    else if (toOrientation == UIInterfaceOrientationLandscapeLeft) toOrientation = UIInterfaceOrientationLandscapeRight;

    UIInterfaceOrientation fromOrientation = [[UIApplication sharedApplication] statusBarOrientation];

    [self willRotateToInterfaceOrientation:toOrientation duration:0.0];
    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) {
        [self willAnimateRotationToInterfaceOrientation:toOrientation duration:[context transitionDuration]];
    } completion:^(id<UIViewControllerTransitionCoordinatorContext> context) {
        [self didRotateFromInterfaceOrientation:fromOrientation];
    }];

}

Todavía no estoy seguro de si debo usar esto fuera del bloque de animación ya que no tengo la duración.

    [self willRotateToInterfaceOrientation:toOrientation duration:0.0];
 36
Author: Camo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-03 18:56:14

Los métodos de rotación obsoletos que has enumerado todavía se llaman cuando la aplicación se ejecuta en dispositivos iOS 8+. Si es compatible con iOS 7, puede continuar usándolos sin problemas. Si solo admite iOS 8+, sería aconsejable usar los métodos no obsoletos en su lugar.

Sin embargo, tenga en cuenta que si implementa los nuevos métodos de rotación y los obsoletos en el mismo controlador de vista, cuando se ejecuta en iOS 7 se llamarán a los métodos obsoletos, y en iOS 8 + solo llamará al nuevos métodos que han reemplazado a los que están obsoletos.

Por ejemplo, si solo implementa willRotateToInterfaceOrientation, se llamará a este método cuando se ejecute en iOS 7 y 8. Si luego agrega viewWillTransitionToSize, iOS 7 seguirá llamando a willRotateToInterfaceOrientation pero iOS 8 no, en su lugar solo llamará a viewWillTransitionToSize.

 6
Author: Joey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-24 17:38:54

Verificaría ese caso específico para tener 100% de confianza, pero no espero ningún problema. También te recomendaría ver session 216 Building Adaptive Apps with UIKit desde WWDC 2014 para obtener más información. Parece que los métodos depreciados no se llaman, por lo que la aplicación debe actualizarse para que funcione correctamente con dispositivos que ejecutan iOS 8.

 2
Author: Julian Król,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-23 17:58:51

Para mí, aquí rotamos "cosas manualmente" con algunos cálculos y un archivo plist que rastrea el tamaño de las cabeceras y cosas por el estilo (así que si queremos cambiar algo botones y así sucesivamente, solo cambiamos este plist no todos los xibs individuales). Y todo nuestro código de rotación está dentro de willLayoutSubviews por lo que todas las cosas son correctas incluso en el nuevo iOS8... a excepción de I También vi que para el nuevo ios8 [[UIScreen mainScreen] bounds].size.width ahora devolver el ancho de acuerdo a la orientación del dispositivo no al tamaño real del dispositivo.

Voy a publicar esto otro hilo:

- (BOOL) isIOS8OrAbove{
    float version802 = 1140.109985;
    float version8= 1139.100000; // there is no def like NSFoundationVersionNumber_iOS_7_1 for ios 8 yet?
    NSLog(@"la version actual es [%f]", NSFoundationVersionNumber);
    if (NSFoundationVersionNumber >= version8){
        return true;
    }
    return false;
}
 1
Author: tyoc213,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-02 16:20:07

Los métodos de rotación todavía funcionan, PERO existen otros problemas:

 1
Author: fabb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:46:30