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.

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

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)
}

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)
    }

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 👍


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
    }
}

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)) {
      ...
    }
  }

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")


    }
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.