Avant iOS 8, nous utilisions le code ci-dessous en conjonction avec les méthodes de délégation supportedInterfaceOrientations et shouldAutoRotate pour forcer l'orientation de l'application à une orientation particulière. J'ai utilisé l'extrait de code ci-dessous pour faire pivoter l'application par programmation vers l'orientation souhaitée. Tout d'abord, je change l'orientation de la barre d'état. Ensuite, il suffit de présenter et de supprimer immédiatement une vue modale pour faire pivoter la vue vers l'orientation souhaitée.
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:YES];
UIViewController *c = [[UIViewController alloc]init];
[self presentViewController:vc animated:NO completion:nil];
[self dismissViewControllerAnimated:NO completion:nil];
Mais cela échoue dans iOS 8. De plus, j'ai vu des réponses dans le débordement de pile où les gens ont suggéré que nous devrions toujours éviter cette approche à partir d'iOS 8.
Pour être plus précis, mon application est un type d'application universel. Il y a trois contrôleurs au total.
Contrôleur First View - Il doit prendre en charge toutes les orientations de l'iPad et uniquement le portrait (bouton d'accueil vers le bas) sur l'iPhone.
Contrôleur Second View - Il ne doit prendre en charge que le paysage dans toutes les conditions
Contrôleur Third View - Il ne doit prendre en charge que le paysage dans toutes les conditions
Nous utilisons le contrôleur de navigation pour la navigation dans les pages. Depuis le premier contrôleur de vue, sur une action de clic de bouton, nous poussons le second sur la pile. Ainsi, lorsque le deuxième contrôleur de vue arrive, quelle que soit l'orientation de l'appareil, l'application doit se verrouiller uniquement en mode paysage.
Vous trouverez ci-dessous mes méthodes shouldAutorotate
et supportedInterfaceOrientations
dans les deuxième et troisième contrôleurs de vue.
-(NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskLandscapeRight;
}
-(BOOL)shouldAutorotate {
return NO;
}
Existe-t-il une solution pour cela ou une meilleure façon de verrouiller un contrôleur de vue dans une orientation particulière pour iOS 8. Veuillez aider !!
la source
Réponses:
Pour iOS 7-10:
Objectif c:
Swift 3:
Appelez-le simplement dans
- viewDidAppear:
le contrôleur de vue présenté.la source
[UIView setAnimationsEnabled:NO];
enviewWillAppear
et[UIView setAnimationsEnabled:YES];
enviewDidAppear
, liés: stackoverflow.com/a/6292506/88597[UINavigationController attemptRotationToDeviceOrientation];
La rotation d'orientation est un peu plus compliquée si vous êtes à l'intérieur d'un
UINavigationController
ouUITabBarController
. Le problème est que si un contrôleur de vue est intégré dans l'un de ces contrôleurs, le contrôleur de navigation ou de barre d'onglets a la priorité et prend les décisions sur l'autorotation et les orientations prises en charge.J'utilise les 2 extensions suivantes sur UINavigationController et UITabBarController afin que les contrôleurs de vue intégrés dans l'un de ces contrôleurs puissent prendre les décisions.
Donnez le pouvoir aux contrôleurs View!
Swift 2.3
Swift 3
Vous pouvez maintenant remplacer la
supportedInterfaceOrientations
méthode ou vous pouvez remplacershouldAutoRotate
dans le contrôleur de vue que vous souhaitez verrouiller, sinon vous pouvez omettre les remplacements dans d'autres contrôleurs de vue dont vous souhaitez hériter du comportement d'orientation par défaut spécifié dans le plist de votre application.Désactiver la rotation
Verrouiller à une orientation spécifique
En théorie, cela devrait fonctionner pour toutes les hiérarchies de contrôleurs de vue complexes, mais j'ai remarqué un problème avec UITabBarController. Pour une raison quelconque, il souhaite utiliser une valeur d'orientation par défaut. Consultez l'article de blog suivant si vous souhaitez en savoir plus sur la façon de contourner certains des problèmes:
Rotation de l'écran de verrouillage
la source
C'est ce qui a fonctionné pour moi:
https://developer.apple.com/library//ios/documentation/UIKit/Reference/UIViewController_Class/index.html#//apple_ref/occ/clm/UIViewController/attemptRotationToDeviceOrientation
Appelez-le dans votre méthode viewDidAppear:.
la source
J'ai trouvé que s'il s'agit d'un contrôleur de vue présenté, vous pouvez remplacer
preferredInterfaceOrientationForPresentation
Rapide:
la source
Cela fonctionne pour moi dans Swift 2 iOS 8.x:
PS (cette méthode ne nécessite pas de remplacer les fonctions d'orientation comme shouldautorotate sur chaque viewController, juste une méthode sur AppDelegate)
Cochez la case "nécessite le plein écran" dans les informations générales de votre projet.
Donc, sur AppDelegate.swift, créez une variable:
Alors, mettez aussi cette func:
Ainsi, dans chaque classe de votre projet, vous pouvez définir cette variable dans viewWillAppear:
Si vous devez faire un choix en fonction du type d'appareil, vous pouvez le faire:
la source
Tout d'abord - c'est une mauvaise idée, en général, quelque chose ne va pas avec l'architecture de votre application, mais
sh..t happens
, si c'est le cas, vous pouvez essayer de faire quelque chose comme ci-dessous:Que dans
AppDelegate
Et chaque fois que vous souhaitez changer d'orientation, procédez comme suit:
Remarque: parfois, l'appareil peut ne pas se mettre à jour à partir d'un tel appel, vous devrez donc peut-être faire comme suit
C'est tout
la source
Cela devrait fonctionner à partir d'iOS 6, mais je ne l'ai testé que sur iOS 8. Sous
UINavigationController
- classe et remplacez les méthodes suivantes:Ou demandez au contrôleur de vue visible
et y mettre en œuvre les méthodes.
la source
Ceci est un retour aux commentaires de la réponse de Sid Shah , concernant la façon de désactiver les animations en utilisant:
Code:
la source
Si vous utilisez navigationViewController, vous devez créer votre propre superclasse pour cela et remplacer:
cela désactivera la rotation dans SecondViewController mais si vous poussez votre SecondViewController lorsque votre appareil est en orientation portrait, votre SecondViewController apparaîtra en mode portrait.
Supposons que vous utilisez un storyboard. Vous devez créer un segue manuel ( Comment faire ) et dans votre méthode "onClick":
Cela forcera l'orientation paysage avant que votre superclasse ne désactive la fonction de rotation automatique.
la source
Sur
Xcode 8
les méthodes sont converties en propriétés, donc ce qui suit fonctionne avecSwift
:la source
portrait
mode, quelle que soit l'orientation sur l'iPad, enshouldAutorotate
revenant vrai, j'ai réussi.J'ai essayé de nombreuses solutions, mais celle qui a fonctionné est la suivante:
Il n'est pas nécessaire de modifier le
info.plist
dans ios 8 et 9.Orientations possibles à partir de la documentation Apple :
la source
La combinaison des réponses Sids et Koreys a fonctionné pour moi.
Extension du contrôleur de navigation:
Puis désactivation de la rotation sur la vue unique
Et en tournant vers l'orientation appropriée avant le segue
la source
La meilleure solution ci-dessus:
n'a pas fonctionné pour moi quand je l'ai appelé dans viewDidAppear du contrôleur de vue présenté. Cependant, cela a fonctionné lorsque je l'ai appelé dans preparForSegue dans le contrôleur de vue de présentation.
(Désolé, pas assez de points de réputation pour commenter cette solution, j'ai donc dû l'ajouter comme ça)
la source
[iOS9 +] Si quelqu'un a fait glisser tout le chemin vers le bas ici car aucune des solutions ci-dessus n'a fonctionné, et si vous présentez la vue que vous souhaitez changer d'orientation par suite, vous voudrez peut-être vérifier cela.
Vérifiez le type de présentation de votre segue. Le mien était «sur le contexte actuel». Quand je l'ai changé en plein écran, cela a fonctionné.
Grâce à @GabLeRoux, j'ai trouvé cette solution.
la source
Mes exigences sont
AVPlayerViewController
pour lire la vidéoLors de la lecture de la vidéo, s'il s'agit d'un paysage, permettez à l'écran de faire pivoter le paysage à droite et le paysage à gauche. S'il s'agit d'un portrait, verrouillez la vue en mode portrait uniquement.
Tout d'abord, définissez
supportedInterfaceOrientationsForWindow
dansAppDelegate.swift
Deuxièmement, dans votre contrôleur de vue principal, définissez les fonctions suivantes
Ensuite, vous devez sous-classer
AVPlayerViewController
Remplacez ces trois fonctions dans
MyPlayerViewController.swift
Étant donné que l'utilisateur peut faire pivoter l'appareil en mode paysage vers la gauche ou vers la droite, nous devons définir la rotation automatique sur true.
Enfin, créez une
MyPlayerViewController
instance dans votre contrôleur de vue et définissez la valeur de la taille de la propriété.Initiez votre joueur avec le bon
videoUrl
, puis assignez votre joueur àplayerViewController
. Bon codage!la source
la source
Il semble encore y avoir un débat sur la meilleure façon d'accomplir cette tâche, alors j'ai pensé partager mon approche (de travail). Ajoutez le code suivant dans votre
UIViewController
implémentation:Pour cet exemple, vous devrez également définir les orientations autorisées de votre appareil sur «Paysage à gauche» dans les paramètres de votre projet (ou directement dans
info.plist
). Changez simplement l'orientation spécifique que vous souhaitez forcer si vous voulez autre chose queLandscapeLeft.
La clé pour moi était l'
attemptRotationToDeviceOrientation
appelviewWillAppear
- sans cela, la vue ne tournerait pas correctement sans faire pivoter physiquement l'appareil.la source
Selon la réponse de Korey Hinton
Swift 2.2:
Désactiver la rotation
Verrouiller à une orientation spécifique
la source
J'ai essayé quelques solutions ici et la chose importante à comprendre est que c'est le contrôleur de vue racine qui déterminera s'il tournera ou non.
J'ai créé le projet objectif-c suivant github.com/GabLeRoux/RotationLockInTabbedViewChild avec un exemple de travail
TabbedViewController
où une vue enfant est autorisée à tourner et l'autre vue enfant est verrouillée en portrait.Ce n'est pas parfait mais cela fonctionne et la même idée devrait fonctionner pour d'autres types de vues racine telles que
NavigationViewController
. :)la source
Selon la solution montrée par @ sid-sha, vous devez tout mettre dans la
viewDidAppear:
méthode, sinon vous ne serez pasdidRotateFromInterfaceOrientation:
viré, donc quelque chose comme:la source
Ma solution
Dans
AppDelegate
:XXViewController
est le ViewController que vous souhaitez prendre en charge en mode Paysage.Ensuite, la solution de Sunny Shah fonctionnerait dans votre
XXViewController
version iOS:Ceci est la fonction utilitaire pour trouver le plus haut ViewController.
la source
Utilisez ceci pour verrouiller l'orientation du contrôleur de vue, testé sur IOS 9:
// Verrouiller l'orientation sur le paysage à droite
la source
J'ai le même problème et je perds tellement de temps pour cela. Alors maintenant, j'ai ma solution. Les paramètres de mon application ne prennent en charge que le portrait.Cependant, certains écrans de mon application ne doivent avoir que le paysage.Je le corrige en ayant une variable isShouldRotate à AppDelegate . Et la fonction chez AppDelegate :
Et enfin quand un ViewControllerA a besoin d'un état de paysage. Faites simplement cela: avant de pousser / présenter à ViewControllerA attribuez isShouldRotate à true . N'oubliez pas lorsque pop / ignorer ce contrôleur attribue isShouldRotate à false à viewWillDisappear .
la source
Pour moi, le VC de niveau supérieur nécessaire pour implémenter les remplacements d'orientation. L'utilisation de VC en bas de la pile n'aura aucun effet si le VC supérieur n'est pas implémenté.
Seul VC-Main est écouté, essentiellement dans mes tests.
la source
Il semble que même toi ici, il y a tellement de réponses que personne ne me suffisait. Je voulais forcer l'orientation, puis revenir à l'orientation de l'appareil mais
[UIViewController attemptRotationToDeviceOrientation];
je n'ai tout simplement pas fonctionné. Ce qui a également compliqué le tout, c'est que j'ai ajouté shouldAutorotate à false en fonction d'une réponse et que je n'ai pas pu obtenir les effets souhaités pour une rotation correcte dans tous les scénarios.Voici donc ce que j'ai fait:
Avant de pousser le contrôleur en appel dans son constructeur init, ceci:
Je sauvegarde donc la dernière orientation de l'appareil et je m'inscris à l'événement de changement d'orientation. L'événement de changement d'orientation est simple:
Et à la vue, je me contente de revenir à n'importe quelle orientation que j'ai en tant qu'utilisateurOreintation:
Et cela doit être là aussi:
Et aussi le contrôleur de navigation doit déléguer à shouldAutorotate et supportedInterfaceOrientations, mais que la plupart des gens ont déjà, je crois.
PS: Désolé, j'utilise des extensions et des classes de base mais les noms sont assez significatifs donc le concept est compréhensible, fera encore plus d'extensions car ce n'est pas trop joli maintenant.
la source