ios iphone objective-c ios8

ios - Métodos de rotación obsoletos, equivalente a ''didRotateFromInterfaceOrientation''?



iphone objective-c (6)

Estoy intentando implementar el nuevo método viewWillTransitionToSize que se ha introducido en iOS 8 (todos los otros métodos de rotación han quedado en desuso). Me gustaría saber cuál es el equivalente de didRotateFromInterfaceOrientation ahora, ya que hay una serie de tareas de limpieza que debemos realizar y no puedo ver un bloque que podamos asignar a UIViewControllerTransitionCoordinator para que se llame cuando ''transition'' a un nuevo tamaño termina. Gracias.


Dado que 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

Estuve 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 recommends :

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


De acuerdo, solo tiene que usar el animateAlongsideTransition:completion: en el UIViewControllerTransitionCoordinator pasado.

- (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]; }


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í 👍


La versión Swift 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) }


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


[[UIApplication sharedApplication] statusBarOrientation] está en desuso en iOS9 tienes que probar contra UITraitCollection para varios dispositivos.

override func willTransitionToTraitCollection(newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { if newCollection.containsTraitsInCollection(UITraitCollection(verticalSizeClass: .Regular)) { ... } }