Méthodes de rotation de l'interface iOS8 non appelées

Puisque willAnimateRotationToInterfaceOrientation:duration: est obsolète dans iOS8, il faut utiliser viewWillTransitionToSize:withTransitionCoordinator: place .

Cependant, cette méthode n'est pas appelée dans mon controller de vue sur iOS8. Y a-t-il autre chose que je dois implémenter pour que ce callback fonctionne?

Je ne trouve rien dans la documentation. La seule chose que j'ai pu find, c'est qu'il appartient au nouveau protocole UIContentContainer . Cependant, même si je l'ajoute explicitement aux protocoles de mon controller, cela ne fonctionne pas.

Des idées?

viewWillTransitionToSize:withTransitionCoordinator: semble fonctionner que si l'interface est en train de changer de taille, ce qui signifie que nous avons pivoté de 90 degrés. Si vous avez un masque sur votre layout qui ne permet que le paysage, lorsque la rotation est de 180 degrés, la taille de l'interface ne change pas, donc cette méthode ne semble pas être appelée.

J'ai travaillé autour de ceci dans mon application en enregistrant à la place à la notification UIDeviceOrientationDidChangeNotification comme:

(À mon avis vue du controllerWillAppear):

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceOrientationDidChange:) name:UIDeviceOrientationDidChangeNotification object:nil]; [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 

(Un dans mon viewWillDisappear [n'oubliez pas de vous désabonner])

 [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications]; [[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil]; 

Mon deviceOrientationDidChange: ressemble à:

 - (void)deviceOrientationDidChange:(NSNotification *)notification { UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; [self willRotateToInterfaceOrientation:orientation duration:1.0]; } 

Selon les docs , n'oubliez pas d'appeler super

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

Sinon, les controllers de vue enfant ne recevront pas le message.

Je sais que cette question est un peu ancienne en ce moment, mais je pense que la question pourrait être résolue d'une manière différente pour certains qui pourraient la rencontrer. Si vous essayez de charger une vue qui fait partie d'un controller DIFFERENT en utilisant addSubview(controller.view) , vous devez également append ce controller au parent (éventuellement la vue que vous ajoutez au controller). Si vous n'ajoutez pas le controller à un parent, vous ne recevrez jamais les mises à jour pour les changements de taille. Nous avons ensuite découvert la raison du changement de l'API d'Apple; Avec l'iPad pro, votre SizeClass peut changer sans rotation avec la capacité multi-tâches. Cela appellera également la méthode:

 viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) 

Dans la class parent, si vous remplacez la méthode ci-dessus, assurez-vous que vous appelez super aussi ou vous findez juste un autre moyen de battre votre tête contre un mur …