Je veux ajouter deux images à une seule image (c'est-à-dire pour une image en paysage et une autre image en portrait) mais je ne sais pas comment détecter les changements d'orientation en utilisant des langues rapides.
J'ai essayé cette réponse mais cela ne prend qu'une seule image
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
if UIDevice.currentDevice().orientation.isLandscape.boolValue {
print("Landscape")
} else {
print("Portrait")
}
}
Je suis nouveau dans le développement iOS, tout conseil serait grandement apprécié!
Réponses:
la source
viewWillTransition
lors du sousUIView
- classement ?.isFlat
. Si vous voulez seulement attraper,portrait
je vous suggère de changer la clause else enelse if UIDevice.current.orientation.isPortrait
. Remarque:.isFlat
cela peut se produire à la fois en portrait et en paysage, et avec just else {} il y aura toujours par défaut (même si c'est un paysage plat).L' utilisation NotificationCenter et UIDevice d »
beginGeneratingDeviceOrientationNotifications
Swift 4.2+
Swift 3
la source
viewWillTransition:
prévoit que le changement se produira lors de l'utilisationUIDeviceOrientationDidChange
est appelé une fois le changement terminé.shouldAutorotate
est défini surfalse
. Ceci est pratique pour les écrans tels que l'écran principal de l'application Appareil photo - l'orientation est verrouillée mais les boutons peuvent pivoter.Code Swift 3 ci- dessus mis à jour:
la source
⚠️ Orientation de l'appareil! = Orientation de l'interface⚠️
Swift 5. * iOS13 et inférieur
Vous devriez vraiment faire la différence entre:
Il existe de nombreux scénarios dans lesquels ces 2 valeurs ne correspondent pas, par exemple:
Dans la plupart des cas, vous voudrez utiliser l'orientation de l'interface et vous pouvez l'obtenir via la fenêtre:
Si vous souhaitez également prendre en charge <iOS 13 (comme iOS 12), procédez comme suit:
Vous devez maintenant définir où réagir au changement d'orientation de l'interface de la fenêtre. Il existe plusieurs façons de le faire, mais la solution optimale est de le faire à l'intérieur
willTransition(to newCollection: UITraitCollection
.Cette méthode UIViewController héritée qui peut être remplacée sera déclenchée chaque fois que l'orientation de l'interface sera modifiée. Par conséquent, vous pouvez effectuer toutes vos modifications dans ce dernier.
Voici un exemple de solution :
En implémentant cette méthode, vous serez alors en mesure de réagir à tout changement d'orientation de votre interface. Mais gardez à l'esprit qu'il ne sera pas déclenché à l'ouverture de l'application, vous devrez donc également mettre à jour manuellement votre interface dans
viewWillAppear()
.J'ai créé un exemple de projet qui souligne la différence entre l'orientation de l'appareil et l'orientation de l'interface. En outre, cela vous aidera à comprendre les différents comportements en fonction de l'étape du cycle de vie que vous décidez de mettre à jour votre interface utilisateur.
N'hésitez pas à cloner et exécuter le référentiel suivant: https://github.com/wjosset/ReactToOrientation
la source
func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator)
n'a pas fonctionné. Je l'ai fait fonctionner en utilisantfunc viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator)
.Swift 4+: J'utilisais ceci pour la conception de clavier logiciel, et pour une raison quelconque, la
UIDevice.current.orientation.isLandscape
méthode me disait que c'était le casPortrait
, alors voici ce que j'ai utilisé à la place:la source
size
paramètre qui est injecté dans viewWillTransitionToSize: withCoordinator: méthode que vous avez écrite ci-dessus. Cela reflétera la taille exacte de votre vue après la transition.Swift 4.2, RxSwift
Si nous avons besoin de recharger collectionView.
Swift 4, RxSwift
Si nous avons besoin de recharger collectionView.
la source
Je crois que la bonne réponse est en fait une combinaison des deux approches:
viewWIllTransition(toSize:)
etNotificationCenter
'sUIDeviceOrientationDidChange
.viewWillTransition(toSize:)
vous avertit avant la transition.NotificationCenter
UIDeviceOrientationDidChange
vous avertit après .Tu dois être très prudent. Par exemple,
UISplitViewController
lorsque le périphérique tourne dans certaines orientations, leDetailViewController
est sorti du tableau duUISplitViewController
sviewcontrollers
et poussé sur celui du maîtreUINavigationController
. Si vous recherchez le contrôleur de vue détaillée avant la fin de la rotation, il peut ne pas exister et se bloquer.la source
Si vous utilisez la version Swift> = 3.0, vous devez appliquer certaines mises à jour de code, comme d'autres l'ont déjà dit. N'oubliez pas d'appeler super:
Si vous envisagez d'utiliser un StackView pour vos images, sachez que vous pouvez faire quelque chose comme ce qui suit:
Si vous utilisez Interface Builder, n'oubliez pas de sélectionner la classe personnalisée pour cet objet UIStackView, dans la section Inspecteur d'identité dans le panneau de droite. Ensuite, créez simplement (également via Interface Builder) la référence IBOutlet à l'instance UIStackView personnalisée:
Prenez l'idée et adaptez-la à vos besoins. J'espère que cela peut vous aider!
la source
Swift 4
J'ai eu quelques problèmes mineurs lors de la mise à jour de la vue ViewControllers à l'aide
UIDevice.current.orientation
, tels que la mise à jour des contraintes des cellules de vue de table pendant la rotation ou l'animation des sous-vues.Au lieu des méthodes ci-dessus, je compare actuellement la taille de la transition à la taille de la vue des contrôleurs de vue. Cela semble être la bonne façon de procéder car on a accès aux deux à ce stade du code:
Sortie sur un iPhone 6:
la source
Toutes les contributions précédentes sont bien, mais une petite note:
a) si l'orientation est définie dans plist, uniquement portrait ou exemple, vous ne serez pas averti via viewWillTransition
b) si nous avons de toute façon besoin de savoir si l'utilisateur a fait pivoter l'appareil, (par exemple un jeu ou similaire ..) nous ne pouvons utiliser que:
testé sur Xcode8, iOS11
la source
Pour obtenir l'orientation correcte au démarrage de l'application, vous devez l'enregistrer
viewDidLayoutSubviews()
. Les autres méthodes décrites ici ne fonctionneront pas.Voici un exemple comment procéder:
Cela fonctionnera toujours, au premier démarrage de l'application , et en cas de rotation pendant que l'application est en cours d'exécution .
la source
Vous pouvez utiliser
viewWillTransition(to:with:)
et taperanimate(alongsideTransition:completion:)
pour obtenir l'orientation de l'interface APRÈS que la transition soit terminée. Il vous suffit de définir et de mettre en œuvre un protocole similaire à celui-ci afin de puiser dans l'événement. Notez que ce code a été utilisé pour un jeu SpriteKit et que votre implémentation spécifique peut différer.Vous pouvez définir des points d'arrêt dans ces fonctions et observer qu'il
interfaceOrientationChanged(to orientation: UIInterfaceOrientation)
est toujours appelé aprèsviewWillTransition(to size: CGSize)
avec l'orientation mise à jour.la source
Une autre façon de détecter les orientations des périphériques est d'utiliser la fonction traitCollectionDidChange (_ :). Le système appelle cette méthode lorsque l'environnement de l'interface iOS change.
De plus, vous pouvez utiliser la fonction willTransition (to: with :) (qui est appelée avant traitCollectionDidChange (_ :)), pour obtenir des informations juste avant l'application de l'orientation.
la source