web-dev-qa-db-fra.com

iOS 8 méthodes de rotation Deprecation - Compatibilité avec les versions antérieures

Dans iOS 8, les méthodes de rotation d'interface sont obsolète . Ceci comprend:

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

Les méthodes de remplacement comprennent:

  • willTransitionToTraitCollection:withTransitionCoordinator:
  • viewWillTransitionToSize:withTransitionCoordinator:

Si les nouvelles méthodes de rotation ne sont pas implémentées et qu'un projet est compilé avec le SDK iOS 8, les contrôleurs de vue -will ne recevront pas d'appels - pour les modèles obsolètes. méthodes de rotation.

Ma préoccupation est la suivante: Qu'advient-il d'une application déjà dans l'AppStore créée avec le SDK iOS 7? Les méthodes de rotation obsolètes seront-elles toujours appelées sur un périphérique iOS 8 ou non?

EDIT:

Les méthodes de rotation sont toujours appelées, mais il existe des modifications/problèmes/bogues dans iOS 8.

Aussi UIScreen est maintenant orienté interface

52
fabb

Les méthodes de rotation sont obsolètes dans le SDK iOS 8. Cela n'aura aucun effet sur les applications construites avec le SDK iOS 7, même sous iOS 8 et probablement plusieurs versions futures d'iOS.

Par exemple, la propriété font de UIButton est obsolète depuis iOS 3.0 et est toujours disponible dans iOS 7.0.

19
mluisbrown

Je viens d'avoir ce problème et je voulais utiliser les mêmes méthodes que j'utilisais auparavant (du moins pour le moment), c'est donc ce que j'ai fait.

- (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];
    }];

}

Je ne suis toujours pas sûr de devoir utiliser ceci en dehors du bloc d'animation car je n'ai pas la durée.

    [self willRotateToInterfaceOrientation:toOrientation duration:0.0];
36
Camo

Les méthodes de rotation obsolètes que vous avez répertoriées sont toujours appelées lorsque l'application est exécutée sur des appareils iOS 8+. Si vous prenez en charge iOS 7, vous pouvez continuer à les utiliser sans problème. Si vous ne supportez que iOS 8+, il serait sage d'utiliser les méthodes non obsolètes.

Toutefois, notez que si vous implémentez les nouvelles méthodes de rotation et les méthodes obsolètes dans le même contrôleur de vue, les méthodes obsolètes seront appelées sur iOS 7 et uniquement sur les nouvelles méthodes qui les ont remplacées. qui sont obsolètes.

Par exemple, si vous implémentez uniquement willRotateToInterfaceOrientation, cette méthode sera appelée lors de son exécution sur iOS 7 et 8. Si vous ajoutez ensuite viewWillTransitionToSize, iOS 7 appellera toujours willRotateToInterfaceOrientation mais iOS 8 ne le fera pas, mais appellera seulement viewWillTransitionToSize.

6
Jordan H

Je vérifierais que ce cas spécifique a 100% de confiance, mais je ne m'attends pas à des problèmes. Je vous recommande également de regarder la session 216 Building Adaptive Apps with UIKit de WWDC 2014 pour obtenir plus d'informations. Il semble que les méthodes dépréciées ne soient pas appelées. L'application doit donc être mise à jour pour fonctionner correctement avec les appareils exécutant iOS 8.

2
Julian Król

Pour moi, ici nous tournons "les choses manuellement" avec quelques calculs et un fichier plist qui suit la taille des en-têtes et des choses comme ça (donc si nous voulons changer quelque chose de boutons et ainsi de suite, nous ne modifions que ce plist, pas tous les xibs individuels) . Et tout notre code de rotation est à l'intérieur willLayoutSubviews donc tout est correct, même sur le nouvel iOS8 ... sauf que j'ai aussi vu cela pour le nouvel ios8 [[UIScreen mainScreen] bounds].size.width retourne maintenant la largeur selon l'orientation du périphérique et non à sa taille réelle.

Je vais poster ceci à un autre fil:

- (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
tyoc213

Les méthodes de rotation fonctionnent toujours [~ # ~] mais [~ # ~] , il existe d'autres problèmes:

1
fabb