iphone uiview views ios transitions

iphone - Comportamiento de la transición usando la transición de Visión y transición con la Visión



uiview views (7)

Estoy intentando crear una transición entre dos subvistas (view1 y view2). Cuando se presiona un botón, quiero que view1 (frontal) se mueva y muestre view2 (atrás). He intentado tanto la transición desde Visión y la transición con Vista. Cada uno funciona, pero cada uno tiene un problema.

transitionFromView : cambia la vista de supervisión (la vista de la ventana completa cambia, no las subvistas). Cuando ocurre este giro, una subvista está en la parte frontal de la vista previa antes del giro, y la otra subvista está en la parte posterior de la solapa, como debe ser. Pero no quiero que la vista de supervisión cambie, solo las subvistas.

TransitionWithView : voltea solo las subvistas, pero la vista ''to'' se muestra 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]; } }


Al utilizar transición desde Vista, tanto la vista frontal como la posterior deben estar dentro de otra vista (no la vista superior). De esta forma no volteará toda la pantalla.

> superview > another view > backview > frontview

UIView.transitionFromView (frontView, toView: backView, duración: 0.5, opciones: .TransitionFlipFromLeft | .ShowHideTransitionViews) {terminado en

}

Es posible que desee hacer que (otra vista) sea igual al tamaño de la vista frontal


Aquí está mi trozo de solución de trabajo, una cosa simple que tomó 2 horas, maldita sea: tenemos 1 botón para voltear cosas, un panel llamado UIView que contiene las 2 vistas que quiero intercambiar con una animación de 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; }]; }


Debe eliminar y agregar las subvistas en el bloque de animación. Además, creo que transitionWithView se supone que toma la súper vista como argumento. Creo que lo que debe hacer para obtener este derecho es usar una vista de contenedor 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];


Habiendo encontrado el mismo problema, estoy de acuerdo con Eric y Sam: transitionWithView o transitionFromView harán lo que usted quiere como se indica arriba siempre y cuando cree una vista de contenedor del tamaño apropiado que desee voltear. De lo contrario, la vista de toda la ventana se volteará.

Entonces, si view1 es la subvista con la que comienza y desea pasar a view2, a continuación, agregue

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

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

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


Me he encontrado con el 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 usando el enfoque TransitionFromView. Para tener un fondo detrás de la animación, también necesitará una supervisión con el fondo para la vista de contenedor.

Mi código se ve como:

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


Tenía el mismo requisito y vi muchos enfoques, desde el uso de capas (que terminan siendo muy complicadas si solo quieres lidiar con un UIView) hasta las sugerencias de que necesitaba un "contenedor" para luego realizar la transición entre sub-vistas. Pero si solo quieres cambiar algo de adelante hacia atrás, como voltear una carta de juego o una ficha de juego, hice un cambio de una línea:

(nota: tengo una serie de UIViews (mosaicos [x] [y]) en una cuadrícula (para un juego). Tengo todos mis nombres de imagen en las tablas / arrays de bases de datos, que se cargan dinámicamente en los UIImages de UIImageViews. imagen para el "reverso" de una tarjeta o mosaico en un UIImage llamado "tileBackPicImageNM".

así que mi código que simplemente cambió la imagen frontal por una imagen de la parte posterior fue:

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

que funciona bien.

pero y ahora, para mostrar una acción flipping, es:

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

Experimenté con diferentes parámetros de "duración" - posteriormente lo convertí en un flotante que establecí en la rutina viewDidLoad. Más rápido que 0.3 es casi no visible, y un valor de 1 o 2 es muy lento ...

Esto no implica dos subvistas, que en mi caso es mucho más útil ya que no quería tener una matriz de contenedores que contengan una jerarquía de vistas, etc ... y en nuevos niveles, etc. siempre recargo las matrices de todas formas...


Tenga en cuenta que la vista del contenedor requiere un color de fondo sólido. Significa algo más que un color claro. Este fue mi error y dediqué bastante tiempo a averiguarlo.