J'ai une UIView qui n'utilise pas la mise en page automatique et certains composants sont affichés en fonction de leur pourcentage de coordonnées X et Y à partir de la vue principale.
Auparavant, j'aurais exécuté une fonction pour mettre à jour leurs positions dans didRotateFromInterfaceOrientation, mais je vois que cela est désormais obsolète dans iOS8.
J'ai jeté un œil à viewWillTransitionToSize mais cela donne des résultats étranges, et il ne semble pas y avoir de fonction viewDidtransitionToSize.
Existe-t-il un moyen simple (dans Swift) d'exécuter une fonction après une rotation de périphérique?
La méthode déléguée viewWillTransitionToSize
est appelée avec un objet conforme UIViewControllerTransitionCoordinator
. Une méthode déclarée par le protocole est animateAlongsideTransition(_:animation, completion:)
. Vous pouvez l'utiliser pour exécuter du code une fois la transition terminée.
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
coordinator.animateAlongsideTransition(nil, completion: {
_ in
// Your code here
})
}
La réponse ci-dessus https://stackoverflow.com/a/26944087/6583492 est tout à fait raison, grâce à Acey et Moonwalkr. Mais pour Swift 3.0 cela ressemblera à ce qui suit
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
coordinator.animate(alongsideTransition: nil) { _ in
// Your code here
}
}
Bien que non demandé ici, version Objective C:
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
[coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) {
// change any properties on your views
} completion:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) {
UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;
if( UIDeviceOrientationIsPortrait(orientation) ) {
NSLog(@"portrait");
} else {
NSLog(@"landscape");
}
}];
}