web-dev-qa-db-fra.com

iOS: comment exécuter une fonction après la rotation de l'appareil (Swift)

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?

58
Richard

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
    })
}
144
Acey

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
    }
}
25
daxh

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");
    }  
}];
}
13
Olivier de Jonge