iOS: Cómo ejecutar una función después de que el dispositivo haya girado (Swift)


Tengo una UIView que no está usando Diseño automático y algunos componentes se muestran en función de su porcentaje de coordenadas X e Y de la vista principal.

Anteriormente habría ejecutado una función para actualizar sus posiciones en didRotateFromInterfaceOrientation sin embargo, veo que esto ahora está obsoleto en iOS8.

He echado un vistazo a Viewwilltransitiontotsize pero está dando resultados extraños, y no parece haber una función Viewdidtransitiontotsize.

Hay un manera fácil (en Swift) para ejecutar una función después de la rotación de un dispositivo?

Author: Richard, 2014-11-15

3 answers

El viewWillTransitionToSize el método delegado se llama con un UIViewControllerTransitionCoordinator objeto conforme. Un método que protocol declara es animateAlongsideTransition(_:animation, completion:). Puede usarlo para que el código se ejecute después de que se complete la transición.

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
    coordinator.animateAlongsideTransition(nil, completion: {
        _ in

        // Your code here
    })
}
 112
Author: Acey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-18 10:22:37

Anterior respuesta https://stackoverflow.com/a/26944087/6583492 {[3] } tiene toda la razón, gracias a Acey y Moonwalkr. Pero para swift 3.0 se verá como el siguiente

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)
    coordinator.animate(alongsideTransition: nil) { _ in
        // Your code here
    }
}
 21
Author: daxh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:33:24

Aunque no se pide aquí la versión del objetivo 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");
    }  
}];
}
 7
Author: Olivier de Jonge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-21 12:56:02