iOS: Présentation d'un controller de vue en mode paysage à partir d'un controller de vue prenant en charge uniquement le mode portrait après la rotation de l'iphone

J'ai une application qui se présente toujours en mode portrait (dans le résumé du projet Xcode, seule l'orientation portrait est prise en charge).

Maintenant, ce que je veux faire, c'est quand j'utilise l'application, à partir de tous les controllers de vue de l'application, si je fais tourner l'appareil en paysage, l'application présente un controller de vue (ARViewController.m) dans le paysage droit, en fait le la rotation vers le paysage à droite est le triggersur pour présenter ARViewController.m. Mais ce que j'ai expérimenté, c'est que depuis le premier controller de vue ne supporte que le portrait et même si j'oriente l'appareil en paysage, le controller de vue (ARViewController.m) que je veux présenter du premier est aussi en portrait, pas dans le paysage juste.

Même si j'écris ceci dans le second controller de vue (ARViewController.m), il ne s'autoroute pas (ce controller de vue peut être présenté dans toutes les orientations):

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{ return YES; } 

Je dois tourner l'iphone une fois après que le deuxième controller de vue (ARViewController.m) soit présenté pour avoir tout dans l'ordre.

Et voici comment j'appelle ce second controller de vue (ARViewController.m) à partir du premier controller de vue:

 ARViewController *arVC = [[ARViewController alloc] initWithNibName:@"ARViewController" bundle:nil]; [self presentModalViewController:arVC animated:YES]; 

Je l'appelle depuis "ViewController.m", celui-ci est défini comme rootViewController dans AppDelegate.m.

C'est la première fois que je fais de telles choses, j'ai cherché des solutions mais toujours le même problème. Des conseils à ce sujet?

J'ai finalement résolu ce problème, je suppose qu'il existe des alternatives mais celle-ci fonctionne bien:

En fait je ne conservais que Portrait dans les ressortingctions d'orientation. Puis quand je tourne le téléphone en paysage à droite ou à gauche, j'appelle mon ARViewController de manière modale, mais avant de le charger je force ce controller de vue en paysage (dans viewWillAppear) en faisant une rotation appropriée comme ici:

 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self transformView2ToLandscape];} -(void) transformView2ToLandscape { NSInteger rotationDirection; UIDeviceOrientation currentOrientation = [[UIDevice currentDevice] orientation]; if(currentOrientation == UIDeviceOrientationLandscapeLeft){ rotationDirection = 1; }else { rotationDirection = -1; } CGAffineTransform transform = [arController.viewController.view transform]; transform = CGAffineTransformRotate(transform, degreesToRadians(rotationDirection * 90)); [arController.viewController.view setTransform: transform];} 

Edit: Dans Swift 4

 override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) transformViewToLansdcape() } func transformViewToLansdcape(){ var rotationDir : Int if(UIDeviceOrientationIsLandscape(UIDevice.current.orientation)){ rotationDir = 1 }else{ rotationDir = -1 } var transform = self.view.transform //90 for landscapeLeft and 270 for landscapeRight transform = transform.rotated(by: (rotationDir*270).degreesToRadians) self.view.transform = transform } extension BinaryInteger { var degreesToRadians: CGFloat { return CGFloat(Int(self)) * .pi / 180 } } 

Ce que j'ai trouvé, c'est que tout d'abord, ce qui empêche toute rotation de l'application est la feuille de résumé du projet. Ce que vous devriez faire est de désélectionner les ressortingctions dans la feuille de résumé du projet et de simplement mettre une méthode dans chaque UIViewController comme vous le souhaitez. Dans le UIViewController dont vous disposez, rendez la méthode disponible pour les orientations paysage et implémentez la méthode

[UIViewControllerSubclass willRotateToInterfaceOrientation:<interfaceOrientation> duration:<NSTimeInterval>]

ce que Apple dit:

willRotateToInterfaceOrientation: durée:

Envoyé au controller de vue juste avant que l'interface user ne commence à tourner.

  • (void) willRotateToInterfaceOrientation: (UIInterfaceOrientation) toInterfaceOrientation durée: (NSTimeInterval) durée

Paramètres

toInterfaceOrientation

La nouvelle orientation pour l'interface user. Les valeurs possibles sont décrites dans UIInterfaceOrientation.

durée

La durée de la rotation en attente, mesurée en secondes.

Discussion

Les sous-classs peuvent replace cette méthode pour effectuer des actions supplémentaires immédiatement avant la rotation. Par exemple, vous pouvez utiliser cette méthode pour désactiver les interactions d'affichage, arrêter la lecture des médias ou désactiver temporairement les mises en plan coûteuses ou les mises à jour en direct. Vous pouvez également l'utiliser pour échanger la vue actuelle contre celle qui reflète la nouvelle orientation de l'interface. Lorsque cette méthode est appelée, la propriété interfaceOrientation contient toujours l'orientation d'origine de la vue.

Cette méthode est appelée indépendamment du fait que votre code effectue des rotations en une ou deux étapes.


Donc, cela semble être la méthode que vous searchz. Implémentez simplement ceci, et mettez votre code d'appel de vue dedans et cela devrait fonctionner. (aussi, placez l'un de ceux-ci dans la vue présentée pour revenir en arrière)

En outre, vous devriez envisager de ne pas présenter le controller de vue de façon modale car il tourne de toute façon et il est évident que l'affichage change.