2012-03-23 9 views
7

Contexto: Estoy tratando de realizar una animación personalizada desde un UIViewController.view normal a un UISplitViewController.view. La animación debe mostrar de izquierda a derecha.iOS: ¿Animar la orientación incorrecta en rootViewController?

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

Una vez que el golpe del usuario, la siguiente es llamado:

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 un modo de retrato, todo salió perfectamente. Sin embargo, cuando el dispositivo está en el modo horizontal, la animación de transición se realiza como si el dispositivo todavía estuviera en el modo vertical. Por ejemplo: en lugar de entrar por la izquierda, viene desde abajo. La orientación de ambas vistas es completamente correcta. Solo la transición es extraña.

+0

Si gira a horizontal en la otra dirección, se produce la animación de la parte superior? ¿O es desde abajo, independientemente de qué camino pases al modo horizontal? La constante trae la animación desde el lado izquierdo de la capa. Me pregunto si el marco de la capa no está actualizado, entonces, ¿cuál era el lado izquierdo de la capa ahora está en la parte inferior después de la rotación? – jmstone617

+0

Eso es correcto. La animación ignora cualquier cambio de orientación. ¿Alguna sugerencia sobre cómo asegurarse de que la capa se actualice? – Byte

+0

Tengo el mismo problema: la orientación del CALayer simplemente no parece coincidir con su vista. Parece que hay algunos otros mensajes similares al respecto, pero ninguna de las soluciones parece funcionar para mí. Girar la capa 90 grados también rota la vista, por lo que no ayuda. – jonydep

Respuesta

9

Por lo tanto, he estado jugando con su código (hice una mejor reconstrucción de cómo se configura su proyecto), y pude obtener el efecto deseado con el siguiente código. Intenté establecer los marcos y los límites de capas, vistas o subcapas, etc., y nada de eso funcionó. CATransform3D, CATransform3DRotates, etc. tampoco estaban haciendo el truco. También busqué en Google por una hora sólida. O nadie ha tenido su problema, o nadie ha resuelto su problema. En cualquier caso, esta solución funciona, ya menos que algún gurú Core Animation puede proporcionar una mejor solución, eres bienvenido 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"]; 
} 
+0

Esta solución funciona, aunque espero que no llegue a esto (ajuste manualmente la transición). Tengo otra animación que depende de la orientación de la ventana que no se aplica a esto. A menos que aparezca una mejor solución, marcaré tu respuesta correcta antes de que termine la recompensa. Gracias. – Byte

+1

Entendido. Lamento no haber podido ofrecerte una mejor solución. Configuré un proyecto de muestra y pasé unas buenas 3 horas en esto ayer tratando de encontrar algo. La idea es simple: actualice el marco de la capa de la ventana para que coincida con la orientación de la capa de la vista inicial. Tristemente, poner esto en práctica no parece tan simple. – jmstone617

+0

¿Estoy en lo cierto al pensar que esto solo selecciona la dirección correcta para la transición? Todavía no ajusta el tamaño de "marco" de la transición? – jonydep

Cuestiones relacionadas