J'utilise Swift et je souhaite pouvoir charger un UIViewController lorsque je tourne en mode paysage, est-ce que quelqu'un peut me diriger dans la bonne direction?
Je ne trouve rien en ligne et un peu confus par la documentation.
ios
swift
orientation-changes
David
la source
la source
Réponses:
Voici comment je l'ai fait fonctionner:
À l'
AppDelegate.swift
intérieur de ladidFinishLaunchingWithOptions
fonction, je mets:puis dans la classe AppDelegate, j'ai mis la fonction suivante:
J'espère que cela aide quelqu'un d'autre!
Merci!
la source
selector
avoir un format de chaîne de"rotated:"
??rotated()
ne le fait pas)UIDeviceOrientation
s'agit de quelque chose de différent deUIInterfaceOrientation
.. Ceci est dû au fait queUIDeviceOrientation
détecte également les orientations face vers le bas et face vers le haut, ce qui signifie que votre code peut basculer entre portrait et paysage de manière aléatoire si votre appareil repose sur une surface presque plate mais légèrement inégale (c.-à-d. Se balançant sur la saillie caméra desla source
Besoin de détecter la rotation lors de l'utilisation de la caméra avec
AVFoundation
, et j'ai constaté que les méthodesdidRotate
( désormais obsolètes ) etwillTransition
n'étaient pas fiables pour mes besoins. L'utilisation de la notification publiée par David a fonctionné, mais n'est pas à jour pour Swift 3.x / 4.x.Swift 4.2 Le nom de la notification a été modifié.
La valeur de clôture reste la même que Swift 4.0:
Pour configurer la notification pour Swift 4.2 :
Pour supprimer la notification pour Swift 4.2 :
En ce qui concerne la déclaration d'obsolescence , mon commentaire initial était trompeur, je voulais donc le mettre à jour. Comme indiqué, l'utilisation de l'
@objc
inférence a été déconseillée, ce qui était à son tour nécessaire pour utiliser un fichier#selector
. En utilisant une fermeture à la place, cela peut être évité et vous avez maintenant une solution qui devrait éviter un crash dû à l'appel d'un sélecteur invalide.Tout ce qui suit ici est obsolète à partir de XCode 10 et iOS 4.2
Swift 4.0 Avec Swift 4.0, Apple nous a encouragés à éviter d'utiliser le
#selector
, donc cette approche utilise maintenant un bloc de complétion. Cette approche est également rétrocompatible avec Swift 3.x et serait l'approche recommandée à l'avenir.Voici l'avertissement du compilateur que vous recevrez dans un projet Swift 4.x si vous utilisez la
#selector
fonction en raison de la dépréciation de l'@objc
inférence:Entrée en rapide évolution sur ce changement .
Configurez le rappel:
Configurez la notification:
Détruit-le:
la source
L'utilisation de la
-orientation
propriété deUIDevice
n'est pas correcte (même si cela pourrait fonctionner dans la plupart des cas) et pourrait conduire à des bogues, par exemple,UIDeviceOrientation
considérez également l'orientation de l'appareil s'il est face vers le haut ou vers le bas, il n'y a pas de paire directe dansUIInterfaceOrientation
enum pour ceux valeurs.De plus, si vous verrouillez votre application dans une orientation particulière, UIDevice vous donnera l'orientation de l'appareil sans en tenir compte.
De l'autre côté, iOS8 a désapprouvé la
interfaceOrientation
propriété sur laUIViewController
classe.Il existe 2 options disponibles pour détecter l'orientation de l'interface:
Ce qui manque encore, c'est un moyen de comprendre le sens d'un changement d'orientation de l'interface, ce qui est très important lors des animations.
Dans la session de WWDC 2014 «Afficher l'avancement du contrôleur dans iOS8», le haut-parleur fournit également une solution à ce problème, en utilisant la méthode qui remplace
-will/DidRotateToInterfaceOrientation
.Voici la solution proposée partiellement implémentée, plus d'infos ici :
la source
Je sais que cette question est pour
Swift
, mais comme c'est l'un des meilleurs liens pour une recherche Google et si vous recherchez le même code dansObjective-C
:la source
Facile, cela fonctionne sous iOS8 et 9 / Swift 2 / Xcode7, il suffit de mettre ce code dans votre viewcontroller.swift. Il imprimera les dimensions de l'écran à chaque changement d'orientation, vous pouvez mettre votre propre code à la place:
la source
didRotateFromInterfaceOrientation()
ne fonctionne pas de manière fiable. Il manque quelques rotations.iewWillTransitionToSize:withTransitionCoordinator:
fonctionne bien.Utilisez le nouveau viewWillTransitionToSize (_: withTransitionCoordinator :)
la source
J'aime vérifier la notification d'orientation car vous pouvez ajouter cette fonctionnalité dans n'importe quelle classe, pas besoin d'être une vue ou un contrôleur de vue. Même dans votre délégué d'application.
SWIFT 5:
que la mise en cache de la notification
la source
Dans l'objectif C
En rapide
Remplacez cette méthode pour détecter le changement d'orientation.
la source
Swift 3 | Notification UIDeviceOrientationDidChange observée trop souvent
Le code suivant imprime «deviceDidRotate» chaque fois que votre appareil change d'orientation dans l'espace 3D - indépendamment d'un changement de l'orientation portrait à l'orientation paysage. Par exemple, si vous tenez votre téléphone en orientation portrait et que vous l'inclinez vers l'avant et l'arrière, deviceDidRotate () est appelé à plusieurs reprises.
Pour contourner ce problème, vous pouvez conserver l'orientation précédente du périphérique et rechercher une modification dans deviceDidRotate ().
Ou vous pouvez utiliser une notification différente qui n'est appelée que lorsque l'appareil passe du paysage au portrait. Dans ce cas, vous souhaitez utiliser la
UIApplicationDidChangeStatusBarOrientation
notification.la source
Implémentation complète de la détection des changements d'orientation dans Swift 3.0.
J'ai choisi d'utiliser cette implémentation parce que les orientations du téléphone
face up
etface down
étaient importantes pour moi, et je voulais que la vue ne change qu'une fois que je savais que l'orientation était dans la position spécifiée.Les éléments importants à noter sont:
unknown
parfois une orientation.J'espère que quelqu'un trouvera cela utile.
la source
la source
Si vous voulez faire quelque chose APRÈS la rotation est terminée, vous pouvez utiliser le
UIViewControllerTransitionCoordinator
gestionnaire de complétion comme cecila source
Depuis iOS 8, c'est la bonne façon de le faire.
la source
Vérifiez si la rotation a changé avec:
viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator)
Avec le,
coordinator.animateAlongsideTransition(nil) { (UIViewControllerTransitionCoordinatorContext)
vous pouvez vérifier si la transition est terminée.Voir le code ci-dessous:
la source
Voici un moyen simple de détecter l'orientation de l'appareil: ( Swift 3 )
la source
willRotate
est obsolète maintenant, meilleure utilisationviewWillTransition
.Swift 4:
Beaucoup de réponses n'aident pas lorsque vous devez détecter sur différents contrôleurs de vue. Celui-ci fait l'affaire.
la source
viewWillDisappear
et ajouteraddObserver
àviewDidLoad
. iOS désabonne automatiquement le contrôleur de vue.UIDevice.current.orientation.isFlat
Mon approche est similaire à ce que bpedit montre ci-dessus, mais avec un focus iOS 9+. Je voulais changer la portée du FSCalendar lorsque la vue pivote.
Ceci ci-dessous a fonctionné, mais je me sentais penaud à ce sujet :)
la source
J'utilise
UIUserInterfaceSizeClass
pour détecter une orientation modifiée dans uneUIViewController
classe comme ça:la source
Pour Swift 3
la source
UIDevice.current.orientation.isFlat
Swift 5
Classe de configuration pour recevoir des notifications de changement d'orientation de l'appareil:
Code du gestionnaire d'installation:
la source
REMARQUE: utilisez simplement ce code pour identifier UIViewController dans quelle orientation
la source
la source
Avec iOS 13.1.2, l'orientation renvoie toujours 0 jusqu'à ce que l'appareil pivote. Je dois appeler UIDevice.current.beginGeneratingDeviceOrientationNotifications () pour obtenir une rotation réelle avant tout événement de rotation.
la source