iOS: ¿Animación de orientación incorrecta en rootViewController?

Context: Estoy intentando realizar una animation personalizada desde una vista UIViewController.view normal a una vista UISplitViewController.view . La animation debería mostrar de izquierda a derecha.

Puse self.window.rootViewController = viewController donde viewController es un UIViewController normal.

Una vez que el usuario desliza, se llama a lo siguiente:

 UIView *theWindow = [viewController.view superview]; [viewController.view removeFromSuperview]; [theWindow addSubview:self.splitViewController.view]; CATransition *animation = [CATransition animation]; [animation setDuration:0.5]; [animation setType:kCATransitionPush]; [animation setSubtype:kCATransitionFromLeft]; [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; [[theWindow layer] addAnimation:animation forKey:@"SwitchToView1"]; 

Cuando el dispositivo está en modo retrato, todo salió perfecto. Sin embargo, cuando el dispositivo está en modo horizontal, la animation de transición se realiza como si el dispositivo todavía estuviera en modo vertical. Por ejemplo: en lugar de venir desde la izquierda, viene desde abajo. La orientación de ambas vistas es completamente correcta. Solo la transición es extraña.

Por lo tanto, he estado jugando con tu código (hice una reconstrucción de la mejor estimación de cómo has configurado tu proyecto), y pude get el efecto deseado con el siguiente código. Intenté configurar los frameworks y los límites de las capas, de las vistas, o subcapas, etc., y nada de eso funcionó. CATransform3D's, CATransform3DRotates, etc. tampoco estaban haciendo el truco. También busqué en Google durante una hora sólida. O nadie ha tenido su problema, o nadie ha resuelto su problema. Independientemente, esta solución funciona, y a less que algún gurú de Core Animation pueda proporcionar una mejor solución, le invitamos a esto:

 - (void)swipeGesture:(UISwipeGestureRecognizer *)sender { UIView *theWindow = [self.viewController.view superview]; UIInterfaceOrientation interfaceOrientation = self.viewController.interfaceOrientation; NSString *subtypeDirection; if (interfaceOrientation == UIInterfaceOrientationLandscapeLeft) { subtypeDirection = kCATransitionFromTop; } else if (interfaceOrientation == UIInterfaceOrientationLandscapeRight) { subtypeDirection = kCATransitionFromBottom; } else { subtypeDirection = kCATransitionFromLeft; } [self.viewController.view removeFromSuperview]; [theWindow addSubview:self.splitViewController.view]; CATransition *animation = [CATransition animation]; [animation setDuration:0.5]; [animation setType:kCATransitionPush]; [animation setSubtype:subtypeDirection]; [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; [[theWindow layer] addAnimation:animation forKey:@"SwitchToView1"]; }