Depuis que mon application est prise en charge pour toutes les orientations. Je voudrais verrouiller uniquement le mode portrait sur un UIViewController spécifique.
Par exemple, supposons qu'il s'agissait d'une application à onglets et lorsque la vue de connexion apparaît de manière modale, je souhaite uniquement que la vue de connexion soit en mode portrait, peu importe la façon dont l'utilisateur fait pivoter l'appareil ou l'orientation actuelle de l'appareil.
swift
uiviewcontroller
portrait
device-orientation
Thiha Aung
la source
la source
Réponses:
Les choses peuvent devenir assez compliquées lorsque vous avez une hiérarchie de vues compliquée, comme avoir plusieurs contrôleurs de navigation et / ou contrôleurs de vue par onglets.
Cette implémentation permet aux contrôleurs de vue individuels de définir quand ils souhaitent verrouiller les orientations, au lieu de compter sur le délégué d'application pour les trouver en itérant dans les sous-vues.
Swift 3, 4, 5
Dans AppDelegate:
Dans une autre structure globale ou classe d'assistance, j'ai créé ici AppUtility:
Ensuite, dans le ViewController souhaité, vous souhaitez verrouiller les orientations:
Si iPad ou application universelle
Assurez-vous que "Nécessite un plein écran" est coché dans Paramètres cible -> Général -> Informations de déploiement.
supportedInterfaceOrientationsFor
Le délégué ne sera pas appelé si cela n'est pas coché.la source
Requires full screen
, cela empêchera l'application disponible de glisser et de diviser la vue. Voir Adoption des améliorations multitâches sur iPad par Apple. J'ai une réponse ne nécessite pas d'activationRequires full screen
Swift 4
AppDelegate
Votre ViewController Ajoutez la ligne suivante si vous n'avez besoin que d'une orientation portrait. vous devez l'appliquer à tous les besoins de ViewController pour afficher le mode portrait.
et cela fera l'orientation de l'écran pour les autres Viewcontroller en fonction de l'orientation physique de l'appareil.
la source
func application
dans le délégué de l'application par cette fonctionfunc application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { return self.orientationLock ?
Swift 3 et 4
Définissez la
supportedInterfaceOrientations
propriété de UIViewControllers spécifiques comme ceci:METTRE À JOUR
Cette solution ne fonctionne que lorsque votre
viewController
n'est pas incorporé dansUINavigationController
, car l'orientation hérite de viewController parent.Dans ce cas, vous pouvez créer une sous-classe de
UINavigationViewController
et définir ces propriétés dessus.la source
Ajoutez ce code pour forcer le portrait et le verrouiller:
Dans votre AppDelegate - définissez supportedInterfaceOrientationsForWindow sur les orientations que vous souhaitez que l'application entière prenne en charge:
la source
Ceci est une solution générique pour votre problème et d'autres connexes.
1. Créez la classe auxiliaire UIHelper et appliquez les méthodes suivantes:
2. Créez un protocole avec votre comportement de désir, car votre cas spécifique sera portrait.
orientation du protocoleIsOnlyPortrait {}
Nota: si vous le souhaitez, ajoutez-le en haut de la classe UIHelper.
3. Étendez votre View Controller
Dans ton cas:
4. Dans la classe de délégué d'application, ajoutez cette méthode:
Notes finales:
la source
Un tas de bonnes réponses dans ce fil, mais aucune ne correspondait tout à fait à mes besoins. J'ai une application à onglets avec des contrôleurs de navigation dans chaque onglet, et une vue doit pivoter, tandis que les autres doivent être verrouillées en portrait. Le contrôleur de navigation ne redimensionnait pas correctement ses sous-vues, pour une raison quelconque. J'ai trouvé une solution (dans Swift 3) en la combinant avec cette réponse, et les problèmes de mise en page ont disparu. Créez la structure comme suggéré par @bmjohns:
Puis sous-classe UITabBarController:
N'oubliez pas de changer la classe de TabBarController dans le storyboard en sous-classe nouvellement créée.
la source
Pour une nouvelle version de Swift, essayez ceci
la source
Voici un moyen simple qui fonctionne pour moi avec Swift 4.2 (iOS 12.2), mettez ceci dans un
UIViewController
pour lequel vous souhaitez désactiver shouldAutorotate:La
.portrait
pièce lui indique dans quelle (s) orientation (s) rester, vous pouvez changer cela comme vous le souhaitez. Les choix sont:.portrait
,.all
,.allButUpsideDown
,.landscape
,.landscapeLeft
,.landscapeRight
,.portraitUpsideDown
.la source
Pour définir l'orientation Paysage sur toutes les vues de votre application et autoriser une seule vue sur Toutes les orientations (pour pouvoir ajouter une pellicule par exemple):
Dans AppDelegate.swift:
Dans: didFinishLaunchingWithOptions
Ailleurs dans AppDelegate.swift:
Ensuite, dans la vue qui passe à celle que vous voulez pouvoir avoir Toutes les orientations:
La dernière chose à faire est de cocher Orientation de l'appareil: - Portrait - Paysage à gauche - Paysage à droite
la source
Créer une nouvelle extension avec
la source
bmjohns -> Vous êtes mon sauveur de vie. C'est la seule solution de travail (avec la structure AppUtility)
J'ai créé cette classe:
et suivi vos instructions, et tout fonctionne parfaitement pour Swift 3 -> xcode version 8.2.1
la source
À partir d'iOS 10 et 11, l'iPad prend en charge Slide Over et Split View. Pour activer une application dans Slide Over et Split View,
Requires full screen
doit être décochée. Cela signifie que la réponse acceptée ne peut pas être utilisée si l'application souhaite prendre en charge Slide Over et Split View. En savoir plus sur l' adoption des améliorations multitâches d'Apple sur iPad ici .J'ai une solution qui permet (1) de décocher
Requires full screen
, (2) une seule fonction à implémenter dansappDelegate
(surtout si vous ne voulez / ne pouvez pas modifier les contrôleurs de vue cible), et (3) éviter les appels récursifs. Pas besoin de classe d'assistance ni d'extensions.appDelegate.swift (Swift 4)
Éditer
@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é. J'ai donc fait un peu plus de tests et découvert quelques faits:
Requires full screen
car je souhaite activer le diaporama et l'affichage des diapositives sur iPad. Cela exige l'application pour soutenir toutes les orientations 4 pour iPad, en Info.plist:Supported interface orientations (iPad)
.Mon application fonctionne de la même manière que Facebook: sur iPhone, la plupart du temps, elle est verrouillée en mode portrait. Lors de la visualisation de l'image en plein écran, permet aux utilisateurs de faire pivoter le paysage pour une meilleure vue. Sur iPad, les utilisateurs peuvent choisir n'importe quelle orientation dans n'importe quel contrôleur de vue. Ainsi, l'application a l'air bien lorsque l'iPad est sur Smart Cover (paysage à gauche).
Pour que l'iPad puisse appeler
application(_:supportedInterfaceOrientationsFor)
, dans Info.plist, ne conservez que portrait pour iPad. L'application perdra la capacité Slide Over + Split View. Mais vous pouvez verrouiller ou déverrouiller l'orientation de n'importe quel contrôleur de vue, à un seul endroit et sans avoir besoin de modifier la classe ViewController.Enfin, cette fonction est appelée lors du cycle de vie du contrôleur de vue, lorsque la vue est affichée / supprimée. Si votre application doit verrouiller / déverrouiller / modifier l'orientation à un autre moment, cela peut ne pas fonctionner
la source
Solution réelle testée pour cela.Dans mon exemple, j'ai besoin que toute mon application soit en mode portrait, mais une seule orientation d'écran doit être en mode paysage.
Code dans AppDelegate comme décrit ci-dessus.
Ensuite, écrivez ce code avant que votre contrôleur de vue d'orientation paysage ne soit présenté / push.
Puis écrivez ce code dans le viewcontroller réel (pour la vue paysage)
la source
J'ai expérimenté un peu et j'ai réussi à trouver une solution propre à ce problème. L'approche est basée sur le balisage de vue via view-> tag
Dans le ViewController cible, affectez simplement la balise à la vue racine comme dans l'exemple de code suivant:
Et enfin, dans AppDelegate.swift, vérifiez si la vue actuellement affichée est celle que nous avons taguée:
Cette approche a été testée avec mon simulateur et semble fonctionner correctement.
Remarque: la vue marquée sera également trouvée si le MVC actuel est superposé avec un ViewController enfant dans la pile de navigation.
la source
Merci à la réponse de @ bmjohn ci-dessus. Voici une version Xamarin / C # fonctionnelle du code de cette réponse, pour économiser aux autres le temps de transcription:
AppDelegate.cs
Classe statique OrientationUtility.cs:
Voir le contrôleur:
la source
Meilleure solution pour verrouiller et modifier l'orientation en mode portrait et paysage:
Regardez cette vidéo sur YouTube:
https://m.youtube.com/watch?v=4vRrHdBowyo
Ce tutoriel est meilleur et simple.
ou utilisez le code ci-dessous:
Voir cette photo
// 1- dans le second viewcontroller, nous définissons paysage à gauche et dans le premier viewcontroller, nous définissons portrat:
// 2- si vous utilisez NavigationController, vous devez ajouter l'extension
la source