Rotacion rota al tratar de segue

Tengo una vista de desplazamiento en mi aplicación y la segunda me desploop a la última página de mi scrollview. Me siguen a tableviewcontroller.

Pero para lograr "paging like animation" al saltar desde scrollview al controller de tableview, extendí la class UIStoryboardSegue e implementé un método como este:

- (void) perform { UIViewController *src = (UIViewController *) self.sourceViewController; UIViewController *dst = (UIViewController *) self.destinationViewController; src.view.transform = CGAffineTransformMakeTranslation(0, 0); dst.view.transform = CGAffineTransformMakeTranslation(320, 0); [UIView animateWithDuration:0.3 animations:^{ [src presentModalViewController:dst animated:NO]; src.view.transform = CGAffineTransformMakeTranslation(320, 0); dst.view.transform = CGAffineTransformMakeTranslation(0, 0); } ]; } 

Y funciona como un encanto cuando el usuario está en la orientación UIInterfaceOrientationPortrait. Pero cuando cambio a UIInterfaceOrientationLandscapeLeft o derecho, no puedo hacer que funcione.

Lo que básicamente quiero hacer aquí es realizar segue para que parezca que el tableviewcontroller está llegando desde el lado izquierdo a la pantalla principal (no desde la parte superior o inferior, ya que es el comportamiento pnetworkingeterminado), como el código anterior funciona para la orientación normal. Me imaginé que la solución sería algo como esto:

 - (void) perform { UIViewController *src = (UIViewController *) self.sourceViewController; UIViewController *dst = (UIViewController *) self.destinationViewController; if ([[UIDevice currentDevice]orientation] == UIInterfaceOrientationLandscapeLeft || [[UIDevice currentDevice]orientation] == UIInterfaceOrientationLandscapeRight){ }else{ src.view.transform = CGAffineTransformMakeTranslation(0, 0); dst.view.transform = CGAffineTransformMakeTranslation(320, 0); } [UIView animateWithDuration:0.3 animations:^{ [src presentModalViewController:dst animated:NO]; if ([[UIDevice currentDevice]orientation] == UIInterfaceOrientationLandscapeLeft || [[UIDevice currentDevice]orientation] == UIInterfaceOrientationLandscapeRight){ }else{ src.view.transform = CGAffineTransformMakeTranslation(320, 0); dst.view.transform = CGAffineTransformMakeTranslation(0, 0); } } ]; } 

Pero es más difícil que lo piense, cualquier ayuda se appriciated.

Actualización de pregunta:

Lo intenté ahora:

 - (void) perform { UIViewController *src = (UIViewController *) self.sourceViewController; UIViewController *dst = (UIViewController *) self.destinationViewController; [UIView transitionWithView:src.navigationController.view duration:0.3 options:UIViewAnimationTransitionFlipFromRight animations:^{ [src.navigationController pushViewController:dst animated:YES]; } completion:NULL]; } 

Obtengo el siguiente error:

 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Pushing a navigation controller is not supported' 

  1. En lugar de codificar en un ancho 320, siempre debe determinar en time de ejecución, por ejemplo, src.view.frame.size.width.

  2. Me sorprende que estuvieras bien con la presentación del retrato, ya que en mi dispositivo, la vista anterior está parpadeada.

  3. Parece que su nuevo bash es un aspecto muy diferente (voltear en lugar de empujar). ¿Para qué efecto vas?

Si quieres voltear, puedes hacer algo como:

 [UIView animateWithDuration:0.5 animations:^{ [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; [sourceViewController.navigationController.view addSubview:destinationViewController.view]; [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:sourceViewController.navigationController.view cache:NO]; } completion:^(BOOL finished){ [destinationViewController.view removeFromSuperview]; [sourceViewController presentViewController:destinationViewController animated:NO completion:nil]; }]; 

Si querías más empujones, por lo general, simplemente cambio frameworks / centros, por ejemplo, podrías hacer algo como:

 float width = sourceViewController.navigationController.view.frame.size.width; CGPoint right = destinationViewController.view.center; right.x += width; destinationViewController.view.center = right; [sourceViewController.navigationController.view addSubview:destinationViewController.view]; [UIView animateWithDuration:0.5 animations:^{ CGPoint left = sourceViewController.navigationController.view.center; left.x -= width; sourceViewController.navigationController.view.center = left; } completion:^(BOOL finished){ [destinationViewController.view removeFromSuperview]; [sourceViewController presentViewController:destinationViewController animated:NO completion:nil]; } ];