Méthodes de rotation obsolètes, équivalentes à «didRotateFromInterfaceOrientation»?

137

J'essaie d'implémenter la nouvelle viewWillTransitionToSizeméthode qui a été introduite dans iOS 8 (toutes les autres méthodes de rotation sont obsolètes). J'aimerais savoir de quoi l'équivalent didRotateFromInterfaceOrientationest maintenant car il y a un certain nombre de tâches de nettoyage que nous devons effectuer et je ne vois pas de bloc que nous pouvons attribuer UIViewControllerTransitionCoordinatorpour être appelé lors de la `` transition '' vers un nouveau finitions de taille. Merci.

étrange
la source

Réponses:

255

Okay trouvé, il suffit d'utiliser la animateAlongsideTransition:completion:méthode sur le passé UIViewControllerTransitionCoordinator.

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{   
    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context)
    {
        UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
        // do whatever
    } completion:^(id<UIViewControllerTransitionCoordinatorContext> context)
    { 

    }];

    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
}
étrange
la source
Cette méthode sera-t-elle appelée à chaque fois que nous tournons comme didRotateFromInterfaceOrientation ?. Pouvez-vous s'il vous plaît me partager la méthode que vous avez utilisée. Merci
ask123
2
Oui, il sera. C'est ce que je fais: - (void) viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) { UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; // do whatever } completion:^(id<UIViewControllerTransitionCoordinatorContext> context) { }]; [super viewWillTransitionToSize: size withTransitionCoordinator: coordinator]; }
étrange
1
Merci - je vais ajouter une version rapide comme réponse pour faire gagner du temps aux gens
DogCoffee
3
statusbarorientation est obsolète dans iOS 9. Quelle est l'option d'autre?
Deepak Sharma
1
@DeepakSharma Je suis un peu en retard à la fête, mais vous pouvez utiliser [UIDevice currentDevice].orientation. Vous pouvez également canaliser ceci dans UIDeviceOrientationIsPortrait([UIDevice currentDevice].orientation)ou UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation). J'espère que cela t'aides!
Jeff
70

La version Swift de la réponse par étrange

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {

    coordinator.animateAlongsideTransition({ (UIViewControllerTransitionCoordinatorContext) -> Void in

        let orient = UIApplication.sharedApplication().statusBarOrientation

        switch orient {
        case .Portrait:
            println("Portrait")
            // Do something
        default:
            println("Anything But Portrait")
            // Do something else
        }

        }, completion: { (UIViewControllerTransitionCoordinatorContext) -> Void in
            println("rotation completed")
    })

    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
}
ChienCafé
la source
C'est étrange parce que je l'ai mis dans mon ViewController et que cela n'a printrien fait dans mon journal. Je suppose que cette méthode n'est pas appelée. Pouvez-vous penser à autre chose qui devrait être branché pour que cela fonctionne?
Voyage
Je viens de l'ajouter à un projet vide (application universelle) et cela fonctionne bien sans avoir besoin d'ajouter quoi que ce soit. Peut-être mettre une instruction de journal au tout début de la méthode et voir si elle est appelée. Je ne peux penser à rien que vous auriez besoin d'ajouter. Quel iOS utilisez-vous?
DogCoffee
@ DogCoffee..il n'est pas appelé. Cela a-t-il quelque chose à voir avec Simulator?
Sam
@Saty fonctionne également dans le simulateur - il vient d'être vérifié à nouveau. Fonctionne comme prévu.
DogCoffee
1
statusbarorientation est obsolète dans iOS 9. Quelle est l'option d'autre?
Deepak Sharma
10

iOS 10.3 et Swift 3

override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {

        coordinator.animate(alongsideTransition: { (_) in
            let orient = newCollection.verticalSizeClass

            switch orient {
            case .compact:
                print("Lanscape")///Excluding iPads!!!

            default:
                print("Portrait")
            }
        }, completion: { _ in
            print("rotation completed")
        })

        super.willTransition(to: newCollection, with: coordinator)
    }
Mike Glukhov
la source
Pourquoi avez-vous besoin d'animation? Vous ne pouvez pas vérifier «newCollection» tout de suite?
cyanide
@cyanide pour synchroniser l'animation avec mon
Mike Glukhov
7

La réponse acceptée dans Swift 3 :

override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
    coordinator.animate(alongsideTransition: { (_) in
        let orient = UIApplication.shared.statusBarOrientation

        switch orient {
        case .portrait:
            print("Portrait")
        // Do something
        default:
            print("Anything But Portrait")
            // Do something else
        }
    }, completion: { (UIViewControllerTransitionCoordinatorContext) -> Void in
      print("rotation completed")
    })

    super.willTransition(to: newCollection, with: coordinator)
}

Cela fonctionne bien pour moi 👍

j_gonfer
la source
Ne fonctionne pas pour moi sur iOS 10 - il imprime l'ancienne orientation, pas la nouvelle.
Vaddadi Kartick
1
@VaddadiKartick parce que vous devriez utiliserlet orient = newCollection.verticalSizeClass switch orient { case .compact: print("Lanscape") // Do something default: print("Portrait") // Do something else }
Mike Glukhov
5

Puisque la question était: quel était l'équivalent de didRotateFromInterfaceOrientation

Je pensais contribuer au code ci-dessous:

@implementation ViewController
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
    [super traitCollectionDidChange:previousTraitCollection];
    if (previousTraitCollection.verticalSizeClass == UIUserInterfaceSizeClassRegular) {
        NSLog(@"User has rotated to landscape");
    } else if (previousTraitCollection.verticalSizeClass == UIUserInterfaceSizeClassCompact) {
        NSLog(@"User has rotated to portrait");
    }
}
@end

Je testais sur un iPhone dans le simulateur, mais mes instructions d'impression ne seront pas exécutées si je teste à l'aide de l'iPad, car traitsCollection ne changera pas.

C'est étrange car c'est exactement ce que recommande Apple :

- (void) traitCollectionDidChange: (UITraitCollection *) previousTraitCollection {
    [super traitCollectionDidChange: previousTraitCollection];
    if ((self.traitCollection.verticalSizeClass != previousTraitCollection.verticalSizeClass)
        || self.traitCollection.horizontalSizeClass != previousTraitCollection.horizontalSizeClass)) {
        // your custom implementation here
    }
}
Ingénieur Tech NYC
la source
Il y a un crochet manquant dans le deuxième extrait de code
Anton Duzenko
Cela fonctionne-t-il sur iPad où les classes verticales et horizontales sont régulières en plein écran?
Deepak Sharma
Votre code n'est pas le même que celui d'Apple, vous ne testez que la classe de taille verticale.
ADG le
Cela fait un moment, on dirait que le contenu du lien a changé.
NYC Tech Engineer
3

[[UIApplication sharedApplication] statusBarOrientation]est obsolète dans iOS9, vous devez tester UITraitCollection pour divers appareils.

  override func willTransitionToTraitCollection(newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {

    if newCollection.containsTraitsInCollection(UITraitCollection(verticalSizeClass: .Regular)) {
      ...
    }
  }
Yannick
la source
6
Seul le passeur était obsolète. Un employé d'Apple a écrit: "La lecture de l'orientation de la barre d'état n'est pas obsolète, mais seulement l'écriture dessus. Cela peut avoir été une erreur dans la façon dont nous avons construit l'en-tête si vous voyez cela sur le getter." ( forums.developer.apple.com/thread/12937 )
Graham Perks
Le getter n'est-il pas également obsolète? Selon la documentation, c'est.
Groot
0

Sur l'Ipad, il n'y a pas de changement de collection de traits, voici donc comment vous détectez la rotation depuis le début et la fin. Voici la syntaxe Swift 5:

override func viewWillTransition(to size: CGSize, with coordinator: 
UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    coordinator.animate(alongsideTransition: { [unowned self] _ in

        self.view.backgroundColor = UIColor.blue
        print("rotation in progress")

    }) { [unowned self] _ in
        self.view.backgroundColor = UIColor.green
        print("rotation complete")


    }
}
Avi Pogrow
la source