6

Es mi primer mensaje en stackoverflow. Soy un novato desarrollador de iOS y no soy un hablante nativo de inglés, por lo que haré todo lo posible para explicar mi problema.UIView transitionFromView: toView: la animación no funciona.

Problema:

he añadido dos puntos de vista a la ventana de mi AppDelegate y quiero saltar de uno a otro usando:

UIView transitionFromView:toView: 

La primera vista (MainScreenView) tiene su propia ViewController . En el archivo MainScreenView .xib tengo un botón con una acción que llama al método "goShow" implementado en mi AppDelegate. En ese método, uso UIView transitionFromView:toView: para pasar a la segunda vista. Hasta ahora todo está funcionando bien. Mi segunda vista (una vista de desplazamiento) se declara programáticamente en mi AppDelegate y tiene un conjunto de imágenes dentro de ella (picturesViewController) y, además de eso, tiene un UIPinchGestureRecognizer.

Estoy usando un reconocedor de gestos para volver a mi pantalla principal. Ahí es donde está el problema. Cuando hago un gesto de pellizco en la vista de desplazamiento, aparece MainScreenView.view inmediatamente antes de la animación, por lo que la animación volteada se ve mal.

El código que estoy usando es:

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 

mainScreen = [[MainScreenViewController alloc] initWithNibName:@"MainScreenViewController" bundle: [NSBundle mainBundle]]; 

CGRect frame = self.window.bounds; 
int pageCount = 10; 
scrollView = [[UIScrollView alloc] initWithFrame:frame]; 
scrollView.contentSize = CGSizeMake(320*pageCount, 480); 
scrollView.pagingEnabled = YES; 
scrollView.showsHorizontalScrollIndicator = FALSE; 
scrollView.showsVerticalScrollIndicator = FALSE; 
scrollView.delegate = self; 

[...] 'While' adding pictures to de scrollView 

UIPinchGestureRecognizer *twoFingerPinch = [[[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(goBackToMain)] autorelease]; 
[scrollView addGestureRecognizer:twoFingerPinch]; 

[self.window addSubview: scrollView]; 
[scrollView setHidden:TRUE]; 
[self.window addSubview: mainScreen.view]; 

[self.window makeKeyAndVisible]; 
return YES; 
} 

-(void) goShow{ 

[UIView transitionFromView:mainScreen.view 
        toView:scrollView 
        duration:0.5 
        options:UIViewAnimationOptionTransitionFlipFromRight | UIViewAnimationOptionShowHideTransitionViews      
       completion:NULL]; 

[UIView commitAnimations];  
} 

-(void) goBackToMain { 

[UIView transitionFromView:scrollView 
        toView:mainScreen.view 
        duration:0.5 
        options:UIViewAnimationOptionTransitionFlipFromRight | UIViewAnimationOptionShowHideTransitionViews      
       completion:NULL]; 

[UIView commitAnimations]; 
} 

estoy usando mostrar/ocultar puntos de vista en lugar de addSubview/removeFromSuperView porque probé el agregar y quitar y tengo un accidente de aplicación en el gesto de pellizco, exactamente en la misma paso que está fallando la animación. Probablemente es el mismo error, pero no puedo encontrar la razón para esto. Cualquier ayuda sería apreciada.

Gracias.

Ok. Con la ayuda de Adrian, aquí está el código UIPinchGesture que resolvió mi problema:

[...] 

UIPinchGestureRecognizer *twoFingerPinch = [[[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(goBackToMain:)] autorelease]; 
[scrollView addGestureRecognizer:twoFingerPinch]; 


-(void)goBackToMain:(UIPinchGestureRecognizer *)recognizer { 

if (recognizer.state == UIGestureRecognizerStateEnded) 
{ 
    [UIView transitionFromView:scrollView 
         toView:mainScreen.view 
         duration:0.4 
         options:UIViewAnimationOptionTransitionFlipFromRight | UIViewAnimationOptionShowHideTransitionViews      
        completion:nil]; 

    [UIView commitAnimations]; 
} 
+1

Eso era mucho mejor explicado que la mayoría de hablantes nativos de inglés a administrar. +1. –

Respuesta

0

Read more about animations in iOS.

En su ejemplo, ha olvidado [UIView beginAnimations].

+0

Hola Adrian, gracias por tu respuesta. – romeup

+0

He leído la documentación de Apple sobre esto, pero no parece ayudar a resolver mi problema. Me estoy dirigiendo a esta aplicación para iOS4 (.3) y [UIView beginAnimations] ha quedado en desuso. Apple ahora recomienda el uso de la API de bloques, y de hecho mi método 'goShow' funciona perfectamente. El aparentemente similar 'goBackToMain' no. La diferencia entre ambos es que un UIPinchGestureRecognizer llama al 'goBackToMain'.No estoy seguro de que el problema esté en el código reconocedor de gestos y cuál es exactamente el problema, pero no puedo pensar en ninguna otra razón para este error. – romeup

+0

si está utilizando un reconocedor de pellizco, intente poner el gesto como un parámetro, para que pueda obtener el estado del gesto y hacer que el código suceda en un evento específico (UIGestureRecognizerStateBegan, ... etc.). De todos modos, si no usa bloques con las animaciones, debería seguir utilizando [UIView begnAnimations]. Aquí hay un ejemplo con lo que se refiere a los gestos: UIPinchGestureRecognizer * twoFingerPinch = [[[UIPinchGestureRecognizer alloc] initWithTarget: self action: @selector (goBackToMain :)] autorelease]; y el método debe ser "- (void) goBackToMain: (UIGestureRecognizer *) gesto" –

0

Primero, no puede mezclar el método anterior beginAnimationcommitAnimation combinación con el nuevo método de bloque transitionFromView.

En segundo lugar, al utilizar la animación de método de bloque, asegúrese de utilizar un contenedor (probablemente un UIView) que será el padre de las dos vistas que desea cambiar. Sin el contenedor, animarás toda la vista en su lugar. Asegúrese de que el contenedor tenga el mismo tamaño que las subvistas que cambiarán.

Ejemplo:

 

    [container addSubView:frontView]; 
    [container addSubView:backView]; 

    [self.view addSubView:container]; 

    [UIView transitionFromView:backView toView:frontView duration:0.5 options:UIViewAnimationOptionTransitionFlipFromRight completion:nil]; 

Cuestiones relacionadas