¿Métodos de rotación en desuso, equivalentes a 'didRotateFromInterfaceOrientation'?


137

Estoy tratando de implementar el nuevo viewWillTransitionToSizemétodo que se ha introducido en iOS 8 (todos los demás métodos de rotación han quedado en desuso). Me gustaría saber cuál es el equivalente didRotateFromInterfaceOrientationahora, ya que hay una serie de tareas de limpieza que debemos realizar y no puedo ver un bloque al que podamos asignar para UIViewControllerTransitionCoordinatorque se nos llame cuando se haga la 'transición' a un nuevo Acabados de tamaño. Gracias.

Respuestas:


255

Bien lo encontré, solo tengo que usar el animateAlongsideTransition:completion:método en el pasado UIViewControllerTransitionCoordinator.

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{   
    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context)
    {
        UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
        // do whatever
    } completion:^(id<UIViewControllerTransitionCoordinatorContext> context)
    { 

    }];

    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
}

¿Este método llamará cada vez que giremos como didRotateFromInterfaceOrientation? ¿Me puede compartir el método que ha utilizado? Gracias
ask123

2
Sí lo hará Esto es lo que hago: - (void) viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) { UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; // do whatever } completion:^(id<UIViewControllerTransitionCoordinatorContext> context) { }]; [super viewWillTransitionToSize: size withTransitionCoordinator: coordinator]; }
extraña

1
Gracias. Agregaré una versión rápida como respuesta para ahorrarle tiempo a la gente
DogCoffee

3
statusbarorientation está en desuso en iOS 9. ¿Qué más es la opción?
Deepak Sharma

1
@DeepakSharma Llego un poco tarde a la fiesta, pero puedes usarlo [UIDevice currentDevice].orientation. También puede canalizar esto en UIDeviceOrientationIsPortrait([UIDevice currentDevice].orientation)o UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation). ¡Espero que esto ayude!
Jeff

70

La versión rápida de la respuesta por extraño

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {

    coordinator.animateAlongsideTransition({ (UIViewControllerTransitionCoordinatorContext) -> Void in

        let orient = UIApplication.sharedApplication().statusBarOrientation

        switch orient {
        case .Portrait:
            println("Portrait")
            // Do something
        default:
            println("Anything But Portrait")
            // Do something else
        }

        }, completion: { (UIViewControllerTransitionCoordinatorContext) -> Void in
            println("rotation completed")
    })

    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
}

Es extraño porque puse esto en mi ViewController, y no hizo printnada en mi registro. Supongo que porque este método no se llama. ¿Se te ocurre algo más que deba enchufarse para que esto funcione?
Viaje

Lo acabo de agregar a un proyecto vacío (aplicación universal) y funciona bien sin la necesidad de agregar nada. Tal vez coloque una declaración de registro al comienzo del método y vea si se está llamando. No puedo pensar en nada que deba agregar. ¿Qué iOS estás ejecutando?
DogCoffee

@ DogCoffee ... no se llama. ¿Tiene algo que ver con el simulador?
Sábado

@Saty también funciona en el simulador, solo revisé nuevamente. Funciona como se esperaba.
DogCoffee

1
statusbarorientation está en desuso en iOS 9. ¿Qué más es la opción?
Deepak Sharma el

10

iOS 10.3 y Swift 3

override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {

        coordinator.animate(alongsideTransition: { (_) in
            let orient = newCollection.verticalSizeClass

            switch orient {
            case .compact:
                print("Lanscape")///Excluding iPads!!!

            default:
                print("Portrait")
            }
        }, completion: { _ in
            print("rotation completed")
        })

        super.willTransition(to: newCollection, with: coordinator)
    }

¿Por qué necesitas animación? ¿No puedes comprobar 'newCollection' de inmediato?
cianuro

@cyanide para sincronizar la animación con mi
Mike Glukhov

7

La respuesta aceptada en Swift 3 :

override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
    coordinator.animate(alongsideTransition: { (_) in
        let orient = UIApplication.shared.statusBarOrientation

        switch orient {
        case .portrait:
            print("Portrait")
        // Do something
        default:
            print("Anything But Portrait")
            // Do something else
        }
    }, completion: { (UIViewControllerTransitionCoordinatorContext) -> Void in
      print("rotation completed")
    })

    super.willTransition(to: newCollection, with: coordinator)
}

Funciona bien para mí 👍


No funciona para mí en iOS 10: imprime la orientación anterior, no la nueva.
Vaddadi Kartick

1
@VaddadiKartick porque deberías usarlet orient = newCollection.verticalSizeClass switch orient { case .compact: print("Lanscape") // Do something default: print("Portrait") // Do something else }
Mike Glukhov

5

Como la pregunta era: ¿cuál era el equivalente de didRotateFromInterfaceOrientation

Pensé que contribuiría con el siguiente código:

@implementation ViewController
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
    [super traitCollectionDidChange:previousTraitCollection];
    if (previousTraitCollection.verticalSizeClass == UIUserInterfaceSizeClassRegular) {
        NSLog(@"User has rotated to landscape");
    } else if (previousTraitCollection.verticalSizeClass == UIUserInterfaceSizeClassCompact) {
        NSLog(@"User has rotated to portrait");
    }
}
@end

Estaba probando en un iPhone en el simulador, pero mis declaraciones de impresión no se ejecutarán si pruebo usando el iPad ya que la colección de rasgos no cambiará.

Esto es extraño porque esto es exactamente lo que Apple recomienda :

- (void) traitCollectionDidChange: (UITraitCollection *) previousTraitCollection {
    [super traitCollectionDidChange: previousTraitCollection];
    if ((self.traitCollection.verticalSizeClass != previousTraitCollection.verticalSizeClass)
        || self.traitCollection.horizontalSizeClass != previousTraitCollection.horizontalSizeClass)) {
        // your custom implementation here
    }
}

Falta un soporte en el segundo fragmento de código
Anton Duzenko

¿Funciona esto en iPad donde las clases verticales y horizontales son regulares en pantalla completa?
Deepak Sharma

Su código no es el mismo que el de Apple, solo está probando la clase de tamaño vertical.
ADG

Ha pasado un tiempo, parece que el contenido del enlace ha cambiado.
NYC Tech Engineer

3

[[UIApplication sharedApplication] statusBarOrientation]está obsoleto en iOS9, debe probarlo contra UITraitCollection para varios dispositivos.

  override func willTransitionToTraitCollection(newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {

    if newCollection.containsTraitsInCollection(UITraitCollection(verticalSizeClass: .Regular)) {
      ...
    }
  }

66
Solo el setter quedó en desuso. Un empleado de Apple publicó: "Leer la orientación de la barra de estado no está en desuso, solo escribirle es. Esto puede haber sido un error en la forma en que construimos el encabezado si está viendo esto en el captador". ( forums.developer.apple.com/thread/12937 )
Graham Perks

Sin embargo, el captador tampoco está en desuso. Según la documentación es.
Groot

0

En el Ipad no hay cambio de colección de rasgos, así que así es como se detecta la rotación desde el inicio y la finalización. Aquí está la sintaxis de Swift 5:

override func viewWillTransition(to size: CGSize, with coordinator: 
UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    coordinator.animate(alongsideTransition: { [unowned self] _ in

        self.view.backgroundColor = UIColor.blue
        print("rotation in progress")

    }) { [unowned self] _ in
        self.view.backgroundColor = UIColor.green
        print("rotation complete")


    }
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.