Comment verrouiller l'orientation de l'une-vue-contrôleur en mode portrait uniquement en Swift
Depuis mon application a obtenu le soutien de tous les orientation. Je voudrais verrouiller uniquement en mode portrait spécifiques UIViewController.
(par exemple, Supposer qu'il a été Onglets d'Application et lorsque SignIn Vue s'affichent sous forme modale, je veux seulement que SignIn Vue de la mode portrait uniquement pas de
importe comment l'utilisateur de faire pivoter l'appareil ou de la façon dont l'appareil actuel
l'orientation sera)
- Cela peut aide les stackoverflow.com/q/24928057/6521116
Vous devez vous connecter pour publier un commentaire.
Les choses peuvent devenir assez désordonné lorsque vous avez un complexe de vue de la hiérarchie, comme le fait d'avoir plusieurs manettes de navigation et/ou l'onglet de la vue des contrôleurs.
Cette mise en place sur la vue individuelle contrôleurs de jeu quand ils voudraient verrouillage des orientations, au lieu de s'appuyer sur l'App Délégué à les trouver en parcourant les sous-vues.
Swift 3 & 4
Dans AppDelegate:
Dans certains autres struct global ou l'accompagnateur de la classe, ici j'ai créé AppUtility:
Puis le ViewController vous souhaitez verrouiller orientations:
Si l'iPad ou de l'Application Universelle
Assurez-vous que "plein écran" est cochée dans les Paramètres de la Cible -> Général> Déploiement d'Info.
supportedInterfaceOrientationsFor
délégué sera pas appelée si ce n'est pas cochée.AppUtility.lockOrientation(.portrait, andRotateTo: .portrait)
dansviewDidAppear
. Il y a deux fonctions dans ma réponse, on est de tout verrouiller les orientations, et l'autre est de les faire pivoter et de la serrure. Si vous souhaitez toujours utiliser l'appareil pour faire tourner si pas dans la position souhaitée, puis utilisez toujourslockOrientation(andRotateTo:)
fonctioniPad
Requires full screen
, qui permettra d'éviter l'application disponible à Glisser Sur et en mode Split. Voir Adopter le Multitâche Améliorations sur iPad par Apple. J'ai un répondre ne nécessite pas d'activerRequires full screen
Requires full screen
puis l'orientation de tous les délégués auront pas le feu dans une application iPad (iPhone, ils ne seront toujours). Qui comprendshouldAutorotate
,preferredInterfaceOrientation
, etsupportedInterfaceOrientations
. Votre réponse utilise encoresupportedInterfaceOrientationsFor
. Avez-vous seulement un test de l'iPhone?application(_:supportedInterfaceOrientationsFor)
ne pas me faire virer de l'iPad jusqu'à ce que vous avez mentionné. Mon application s'exécute en mode portrait sur l'iPhone, à l'exception d'une visionneuse d'image. En raison de la Smart Cover, je crois que de nombreux utilisateurs vont utiliser l'iPad en mode paysage. J'ai trouvé le moyen d'obtenir le feu sur un iPad sansRequires full screen
. Dans l'Info.plist, de réduire à la foisSupported interface orientations
etSupported interface orientations (iPad)
à un seul élément:Portrait (bottom home button)
. Cependant, l'application n'apparaît pas dans la Diapositive Plus. Glisser est juste portrait, n'est-ce pas?ViewContoller
à une autre, lorsque dans des orientations différentes. Sauf que. WOW!viewWillAppear
àviewDidAppear
(en particulier pour les SpriteKit environnements..) afin de permettre la bonne mise en page de dessin => faire pivoter et de l'utilisationAppUtility.lockOrientation(.portrait, andRotateTo: .portrait)
Swift 4
AppDelegate
Votre ViewController
Ajoutez la ligne Suivante si vous avez besoin seulement de l'orientation portrait. vous devez l'appliquer à tous les ViewController besoin de l'afficher en mode portrait.
et
qui fera de l'orientation de l'écran pour les autres Viewcontroller selon le dispositif d'orientation physique.
func application
au sein de délégué d'application avec cette fonctionfunc application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { return self.orientationLock ?
Ajouter ce code à la force de portrait et de le verrouiller:
Dans votre AppDelegate - set supportedInterfaceOrientationsForwindow à ce que les orientations de l'ensemble de la demande de soutien:
Ce générique est une solution pour votre problème et d'autres liés.
1. Créer auxiliar de classe UIHelper et de mettre sur les méthodes suivantes:
2. Créer un Protocole avec votre désir de comportement, pour votre cas spécifique seront portrait.
protocole orientationIsOnlyPortrait {}
Nota: Si vous le souhaitez, ajouter dans le haut de UIHelper Classe.
3. Prolonger votre Vue-Contrôleur
Dans votre cas:
4. En application de délégué de classe ajouter cette méthode:
Notes Finales:
le protocole.
afficher les contrôleurs de
Une poignée de bonnes réponses dans ce thread, mais aucun ne correspondait tout à fait à mes besoins. J'ai des onglets d'application avec les contrôleurs de la navigation dans chaque onglet, et d'un point de vue nécessaire pour faire tourner, tandis que les autres devaient être verrouillé en mode portrait. La manette de navigation n'était pas le redimensionnement de la sous-vues correctement, pour une raison quelconque. Trouvé une solution (en Swift 3), en se combinant avec cette réponse, et la mise en page des questions disparu. Créer la structure comme le suggèrent par @bmjohns:
Puis une sous-classe UITabBarController:
Ne pas oublier de changer la classe de l'TabBarController dans le storyboard pour le nouvellement créé sous-classe.
Pour définir l'orientation Paysage à toutes les vues de votre application & n'autoriser qu'une seule vue Toutes les orientations (pour être en mesure d'ajouter de la pellicule, par exemple):
Dans AppDelegate.swift:
Dans: didFinishLaunchingWithOptions
Ailleurs dans AppDelegate.swift:
Puis dans la vue que segue à celui que vous voulez être en mesure d'avoir Toutes les orientations:
Dernière chose à tique d'orientation de l'écran:
- Portrait
- Paysage De Gauche
- Paysage De Droit
Swift 3 & 4
Définir la
supportedInterfaceOrientations
propriété de certains UIViewControllers comme ceci:bmjohns -> Vous êtes ma vie sauveur. C'est la seule solution de travail (Avec la AppUtility struct)
J'ai créé cette classe:
et suivi vos instructions, et tout fonctionne parfaitement pour Swift 3 -> xcode version 8.2.1
Que de iOS 10 et 11, l'iPad prend en charge le Glisser Sur et Vue partagée. Afin de permettre une application à Glisser Sur et en mode Split,
Requires full screen
doit être décochée. Cela signifie que l'on a accepté la réponse ne peut pas être utilisé si l'application souhaite soutenir le Glisser Sur et Vue partagée. Voir plus d'Apple, l'Adoption de Multitâche Améliorations sur iPad ici.J'ai une solution qui permet (1) de la désactivation de
Requires full screen
, (2) qu'une fonction à être mis en œuvre dansappDelegate
(surtout si vous ne voulez pas /ne pouvez pas modifier la vue cible des contrôleurs), et (3) d'éviter les appels récursifs. Pas besoin de l'aide de la classe, ni les extensions.appDelegate.swift (Swift 4)
Modifier
@bmjohns a souligné que cette fonction n'est pas appelée sur iPad. J'ai vérifié et oui, il n'a pas été appelé. Donc, j'ai fait un peu plus de tests et découvert quelques faits:
Requires full screen
parce que je veux activer le Glisser Sur et faites Glisser la Vue sur l'iPad. Qui nécessite l'application de soutenir tous les 4 orientation pour l'iPad, en Info.plist:Supported interface orientations (iPad)
.Mon application fonctionne même manière que Facebook: sur l'iPhone, la plupart du temps, il est immobilisé à portrait. Lors de la visualisation d'une image en plein écran, permet aux utilisateurs de faire pivoter le paysage pour mieux voir. Sur iPad, les utilisateurs peuvent tourner à n'importe quelle orientation dans n'importe quelle vue des contrôleurs. Donc, l'appli a l'air sympa lorsque l'iPad est sur Smart Cover (paysage à gauche).
Pour iPad appeler
application(_:supportedInterfaceOrientationsFor)
, en Info.plist, seulement de garder portrait pour l'iPad. L'application va perdre le Glisser Sur + la Vue Fractionnée de capacité. Mais vous pouvez verrouiller ou déverrouiller l'orientation pour tous-vue-contrôleur, en un seul endroit et pas besoin de modifier le ViewController classe.Enfin, cette fonction appelée sur la vue du contrôleur de cycle de vie, lorsque la vue est affichée/supprimé. Si votre application a besoin de verrouiller/déverrouiller/changer d'orientation en d'autres temps, il pourrait ne pas fonctionner
Créer une nouvelle extension avec
Grâce à @bmjohn la réponse ci-dessus. Ici, c'est un travail Xamarin /C# version de la réponse du code, pour en sauver d'autres, le temps de la transcription:
AppDelegate.cs
Statique OrientationUtility.cs de la classe:
- Vue-Contrôleur:
Réelle Solution testée pour cette.Dans mon exemple, j'ai besoin de mon ensemble de l'application doit être en mode portrait, mais un seul écran, l'orientation doit être en mode paysage.
Code dans AppDelegate que les réponses ci-dessus décrit.
Puis écrivez ce code avant votre orientation paysage viewcontroller sera présenté/push.
Puis écrire ce code dans le réel viewcontroller(Pour le format paysage)
Voici une méthode simple qui fonctionne pour moi avec Swift 4.2 (iOS 12.2), mettre cela dans une
UIViewController
pour lequel vous souhaitez désactiver shouldAutorotate:La
.portrait
partie raconte dans lequel orientation(s) de rester, vous pouvez modifier ce que vous voulez. Les choix sont:.portrait
,.all
,.allButUpsideDown
,.landscape
,.landscapeLeft
,.landscapeRight
,.portraitUpsideDown
.