AutoLayout no cambiará el tamaño de la vista al girar en una vista de contenedor personalizado?

Tengo una vista de contenedor muy básica que contiene una barra lateral y intercambia los controlleres de vista en el área de contenido (piense en UISplitView pero con un pequeño icono en la barra lateral / UITabBar vertical).

El controller de vista de contenedor utiliza autoLayout y cambia el tamaño correctamente cuando se gira. Content viewController 1 utiliza la reproducción automática y se realizó con IB, por lo que tiene un file xib. Content viewController 2 henetworkinga de UITableViewController y no usa un xib.

Si asigno viewController 1 como el controller de vista raíz y giro, el cambio de tamaño funciona y aquí están las devoluciones de llamada que obtengo en viewController 1:

  • willRotateToInterfaceOrientation
  • updateViewConstraints
  • viewWillLayoutSubviews
  • didRotateFromInterfaceOrientation

Sin embargo, si asigno mi controller de vista de contenedor como el controller de vista raíz, cargue viewController 1 y gire, el cambio de tamaño no funciona. Y solo obtengo las siguientes devoluciones de llamada dentro de viewController 1:

  • willRotateToInterfaceOrientation
  • didRotateFromInterfaceOrientation

Dentro de mi contenedor de controller de vista, así es como cambio los controlleres de vista:

[self addChildViewController:toViewController]; [toViewController didMoveToParentViewController:self]; // Remove the old view controller [fromViewController willMoveToParentViewController:nil]; [fromViewController.view removeFromSuperview]; [fromViewController removeFromParentViewController]; // Add the new view [self.contentContainerView addSubview:toViewController.view]; 

Ahora, obtengo las devoluciones de llamada que indican que está a punto de ocurrir una rotation, pero parece que no se llama a updateViewConstraints ni a viewWillLayoutSubviews. Esto explica por qué el cambio de tamaño no está sucediendo, pero ¿por qué no se llaman esos methods una vez que pongo el controller de vista en una vista de contenedor?

También traté de devolver explícitamente SÍ en mi contenedor en ambos

 shouldAutomaticallyForwardAppearanceMethods 

y

 shouldAutomaticallyForwardAppearanceMethods 

aunque esto ya debería ser el pnetworkingeterminado.

Además, el controller de vista no realizado con IB (controller de vista 2) cambia de tamaño correctamente al girar dentro del contenedor. Sin embargo, no uso explícitamente NSLayoutConstraints en este, así que sospecho que es pnetworkingeterminado en Springs y Struts para cambiar el tamaño al girar.

¿Necesito reenviar otros events en mi contenedor de controller de vista para que el controller de vista de layout automático networkingimensione correctamente al rotar?

OK, creo que me estaba perdiendo este método aquí en mi vista contenedor del controller:

 - (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { self.contentViewController.view.frame = self.contentContainerView.bounds; } 

Si bien esto cambia de tamaño ahora correctamente al girar, todavía no se activa

 updateViewConstraints 

en mi controller de vista hijo. Interesante

Parece que iOS 8 llama a updateViewConstraints por ti. Pero iOS 7 no lo hizo. Para get esta llamada en iOS 7, llame a setNeedsUpdateConstraints, así:

 - (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration { [super willAnimateRotationToInterfaceOrientation:interfaceOrientation duration:duration]; BOOL isiOS7 = floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_7_1; if (isiOS7) { // Trigger a call to updateViewConstraints [self.view setNeedsUpdateConstraints]; } } 

En updateLayoutConstraints, una buena manera de verificar qué orientación es la que se usa para el layout es verificar la orientación de la barra de estado. Esto funciona para 7 y 8.

 UIInterfaceOrientation orientation = [[UIApplication shanetworkingApplication] statusBarOrientation]; BOOL layoutAsLandscape = UIInterfaceOrientationIsLandscape(orientation);