2010-08-30 11 views
20

Estoy intentando crear una transición entre dos subvistas (view1 y view2). Cuando se presiona un botón, quiero que view1 (frontal) se voltee y muestre view2 (atrás). He intentado tanto transitionFromView como transitionWithView. Cada uno funciona, pero cada uno tiene un problema.Comportamiento de transición utilizando transitionFromView y transitionWithView

transitionFromView - voltea la supervista (toda la ventana se voltea, no las subvistas). Cuando sucede esto, una subvista está en el frente de la supervista antes de la tapa, y la otra subvista está en la parte posterior de la tapa, como debería ser. Pero no quiero que la supervista se voltee, solo las subvistas.

transitionWithView - voltea solamente los subvistas - pero la 'a' vista se visualiza antes de que ocurra la transición.

¿Alguien tiene alguna sugerencia?

-(IBAction) button1action:(id) sender { 

if ([sender tag] == 0) { 

    [UIView transitionFromView:view2 toView:view1 duration:2.0 
    options:UIViewAnimationOptionTransitionFlipFromLeft 
    completion:nil]; 
} 

else { 
    [view1 removeFromSuperview];  
    [self.view addSubview:view2]; 
    [UIView transitionWithView:view2 
    duration:2.0 
    options:UIViewAnimationOptionTransitionFlipFromRight + 
    UIViewAnimationOptionShowHideTransitionViews 
     animations:^{} 
    completion:nil]; 
} 
} 
+4

Por favor, marque una pregunta a continuación como la respuesta, o introduzca una respuesta propia que resuelva su problema para ayudar a la comunidad. – Sam

+0

¿Por qué debería marcar una pregunta como la respuesta? : D –

Respuesta

26

tiene que quitar y añadir los subvistas en el bloque de animación. Además, creo que se supone que transitionWithView toma la supervisión como argumento. Creo que lo que debe hacer para hacerlo bien es usar una vista de contenedor que sea del mismo tamaño que las vistas que desea voltear.

Esto se copia de la documentación:

[UIView transitionWithView:containerView 
     duration:0.2 
     options:UIViewAnimationOptionTransitionFlipFromLeft 
     animations:^{ [fromView removeFromSuperview]; [containerView addSubview:toView]; } 
     completion:NULL]; 
+0

Esto no parece funcionar – jjxtra

+1

La vista del contenedor es la clave. Esto está probado y trabajando en ios6 y ios7 – Jameo

12

se han topado con este mismo problema, y ​​estoy de acuerdo con la respuesta anterior. Parece que debe tener una vista de contenedor para animar una transición de una subvista a otra subvista.

Estoy utilizando el enfoque transitionFromView. Para tener un fondo detrás de la animación, también necesitarás una supervista con el fondo para la vista del contenedor.

Mi código es el siguiente:

[UIView transitionFromView:view1 
         toView:view2 
         duration:0.5 
         options:UIViewAnimationOptionTransitionFlipFromRight | 
           UIViewAnimationOptionAllowUserInteraction | 
           UIViewAnimationOptionBeginFromCurrentState 
        completion:nil]; 
1

que tenían el mismo requisito, y vieron muchos enfoques - desde el uso de capas (que termina muy complicado si sólo quiere tratar con una UIView) a las sugerencias de que Necesitaba un "contenedor" para luego hacer la transición entre subvistas. Pero si solo quieres cambiar algo de adelante hacia atrás, como voltear una baraja o un juego, hice un cambio de línea:

(nota: tengo una matriz de UIViews (fichas [x] [y ]) en una grilla (para un juego). Tengo todos mis archivos de imagen en tablas/matrices de bases de datos, que dinámicamente se cargan en los UIImages de UIImageViews. La imagen para el "dorso" de una carta o ficha en un UIImage llamado " tileBackPicImageNM"

por lo que mi código que simplemente cambió la imagen frontal por una imagen de la parte trasera era:..

[tiles[indexX][indexY] setImage:[UIImage imageNamed:tileBackPicImageNM]]; 

que funciona muy bien

pero y ahora, para mostrar una acción de volteo, que es:

[UIView transitionWithView:tiles[indexX][indexY] duration:0.3 options:UIViewAnimationOptionTransitionFlipFromLeft 
        animations:^{ 
         [[indexX][indexY] setImage:[UIImage imageNamed:tileBackPicImageNM]]; 
        } 
        completion:NULL];  

que experimentaron con diferentes parámetros de "duración" - posteriormente convertido en un flotador que puse en la rutina viewDidLoad. Más rápido que 0.3 es casi invisible, y un valor de 1 o 2 es muy lento ...

Esto no implica dos sub-vistas, que es mi caso es mucho más útil ya que no quería tener una matriz de contenedores que contiene una jerarquía de vistas, etc ... y en nuevos niveles, etc. siempre vuelva a cargar las matrices de todos modos ...

5

Al haber tropezado con el mismo problema, estoy de acuerdo con Eric y Sam: o transitionWithView o transitionFromView harán lo que quieran como se indica arriba, siempre y cuando creen una vista de contenedor tamaño que desea voltear. De lo contrario, toda la vista de la ventana se invertirá.

Así que si Vista1 es la subvista de comenzar con y quiere dar la vuelta a VIEW2 luego añadir

UIView *containerView = [[UIView alloc] initWithFrame:appropriateSize]; 
[containerView addSubview:view1]; 

Y entonces la forma más sencilla para animar es probablemente:

[UIView transitionFromView:view1 
        toView:view2 
        duration:2.0 
        options:UIViewAnimationOptionTransitionFlipFromLeft 
       completion:nil]; 
7

aquí está mi solución de trabajo stub, una cosa simple que demoró 2 horas, maldito: tenemos 1 botón para voltear cosas, un panel llamado UIView que contiene las 2 vistas que quiero intercambiar con una animación flip.

-(void)viewDidLoad{ 
    [super viewDidLoad]; 
    UIButton *btnFlip = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    btnFlip.frame = CGRectMake(10, 10, 50, 30); 
    [btnFlip setTitle:@"flip" forState:UIControlStateNormal]; 
    [btnFlip addTarget:self action:@selector(flip) forControlEvents:UIControlEventTouchUpInside]; 
    [self.view addSubview:btnFlip]; 

    panel = [[UIView alloc] initWithFrame:CGRectMake(10, 40, 300,300)]; 
    panel.backgroundColor = [UIColor darkGrayColor]; 
    [self.view addSubview:panel]; 

    panelBack = [[UIView alloc] initWithFrame:CGRectMake(10, 40, 280, 200)]; 
    panelBack.tag = 1; 
    panelBack.backgroundColor = [UIColor brownColor]; 
    [panel addSubview:panelBack]; 

    panelFront = [[UIView alloc] initWithFrame:CGRectMake(10, 40, 280, 200)]; 
    panelFront.tag = 2; 
    panelFront.backgroundColor = [UIColor whiteColor]; 
    [panel addSubview:panelFront]; 

    displayingFront = TRUE; 
} 

-(void)flip{ 

    [UIView transitionWithView:panel 
    duration:0.5 
    options:(displayingFront ? UIViewAnimationOptionTransitionFlipFromRight : UIViewAnimationOptionTransitionFlipFromLeft) 
    animations:^{ 
     if (displayingFront) { 
      //panelFront.hidden=TRUE; 
      //panelBack.hidden = FALSE; 
      [panelFront removeFromSuperview]; 
      [panel addSubview:panelBack]; 
     }else{ 
      //panelFront.hidden=FALSE; 
      //panelBack.hidden = TRUE; 
      [panelBack removeFromSuperview]; 
      [panel addSubview:panelFront]; 
     } 
    } 
    completion:^(BOOL finished){ 
     displayingFront = !displayingFront; 
    }]; 
} 
+0

cool ... funciona a la perfección – RATTLESNAKE

0

Tenga en cuenta que la vista contenedor requiere un sólido color.It fondo significa otra cosa que color.This claras fue mi error y pasó bastante tiempo para averiguarlo.

0

usando transitionFromView, tanto la vista frontal como la posterior deberían estar dentro de otra vista (no en la vista superior). de esta manera no cambiará toda la pantalla.

> superview 
>  another view 
>  backview 
>  frontview 

UIView.transitionFromView (FrontView, toView: backview, duración: 0,5, opciones: .TransitionFlipFromLeft | .ShowHideTransitionViews) {acabados en

}

Es posible que desee hacer la (otra vista) igual al tamaño del frenteVer

Cuestiones relacionadas