ios uiviewcontroller screen-orientation autorotate presentviewcontroller

"ViewWillTransitionToSize:" no se invoca en iOS 9 cuando el controlador de vista se presenta de manera modal



uiviewcontroller screen-orientation (4)

Les presento un controlador de vista desde otro:

- (void)showModalView { UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; MySecViewController *mySecViewController = [storyboard instantiateViewControllerWithIdentifier:@"secController"]; mySecViewController.delegate = self; [self presentViewController:mySecViewController animated:YES completion:nil]; }

Luego, en el UIViewController presentado, el método viewWillTransitionToSize:withTransitionCoordinator: se llama en iOS 8 pero no en iOS 9 ...

Gracias


En su controlador de vista actual, si anula viewWillTransitionToSize:withTransitionCoordinator: asegúrese de llamar super . De lo contrario, este mensaje no se propagará a los controladores de vista secundarios.

Para Objective-C :

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; // Your other code ...

Y Swift :

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { super.viewWillTransition(to: size, with: coordinator) // Your other code ... }


La gente ya ha explicado que hay que llamar super . Me gustaría agregar una información que pueda ayudar a las personas que se habrían enfrentado a lo que yo enfrentaba.

Escenario: principal -> secundario (viewWillTransition no se llama en secundario)

Si su controlador de vista es un controlador de vista secundario , compruebe si se llama al delegado del controlador de vista principal y si se llama a super . De lo contrario, no se propagará al controlador de vista secundaria.

class ParentViewController: UIViewController { func presentChild() { let child = ChildViewController() present(child, animated: false, compeltion: nil) } override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { super.viewWillTransition(to: size, with: coordinator) // If this line is missing your child will not get the delegate call in it''s viewWillTransition // Do something } } class ChildViewController: UIViewController { // This method will not get called if presented from parent view controller and super is not called inside the viewViewWillTransition available there. override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { super.viewWillTransition(to: size, with: coordinator) //Do something } }

PD: esto me sucedió porque no escribí el código para el padre.


Puede parecer un caso trivial, pero al usar un iPad, verifique que el usuario no haya activado el bloqueo de rotación en la configuración o en el panel de control o el botón lateral


Tal vez sea un poco tarde, pero pongo esto aquí para cualquiera que encuentre este problema frustrante.

Tenga en cuenta que viewWillTransitionToSize:withTransitionCoordinator: veces recibe una llamada en el viewWillTransitionToSize:withTransitionCoordinator: del controlador de vista que espera. (Y si ese controlador de vista también tiene un presentingViewController , puede ser llamado para eso)

Realmente no pude entender la lógica detrás de esto, pero ese fue el punto en mi caso. Así que tuve que anular viewWillTransitionToSize:withTransitionCoordinator: en muchos de mis controladores de vista como este:

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; [self.presentedViewController viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; }