2012-01-27 11 views
24

Estoy desarrollando un juego que contenía algo de vista (como juego de tarjeta de memoria) y quiero que cuando el usuario toque una carta este voltee y muestre otra vista. Yo uso este código:iOS - Animación de volteo solo para vista específica

- (void)flipCard:(id)sender { 

    UIButton *btn=(UIButton *)sender; 
    UIView *view=[btn superview]; 
    UIView *flipView=[[UIView alloc] initWithFrame:[view frame]]; 
    [flipView setBackgroundColor:[UIColor blueColor]]; 
    [[flipView layer] setCornerRadius:10]; 

    NSLog(@"Flip card : view frame = %f, %f",view.frame.origin.x, view.frame.origin.y); 

    [UIView transitionFromView:view toView:flipView duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:^(BOOL finished) { 
    }]; 

} 

Cada punto de vista tiene un botón transparente que cubre la totalidad de la vista, de modo que cuando el usuario toque en una vista es como toque el botón. El botón llama al método anterior que pasa al remitente. Cuando comienza la animación, todas las vistas se invierten, no solo la vista que obtengo del remitente. ¿Cómo puedo hacer?

+0

Quizás no sea una solución directa, pero puede para extender UIButton por los botones que usaste en las tarjetas y tener un puntero débil a la vista de la tarjeta, por lo tanto, llamar a btn.cardView definitivamente te daría la vista de la tarjeta que deseas, si la supervista no funciona. –

Respuesta

47

El siguiente código podría ayudar con su problema. Creo que es más limpio que usar un botón transparente.

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    flipped = NO; 
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)]; 

    [flipContainerView addGestureRecognizer:tapGesture]; 
    [tapGesture release]; 
} 

- (void)handleTap:(UITapGestureRecognizer *)sender { 
    if (sender.state == UIGestureRecognizerStateEnded) { 
     [UIView transitionWithView:flipContainerView 
          duration:1 
          options:UIViewAnimationOptionTransitionFlipFromLeft 
         animations:^{ 

      if (!flipped) { 
       [frontCard setHidden:YES]; 
       [flipContainerView addSubview:backCard.view]; 
       flipped = YES; 
      } else { 
       [frontCard setHidden:NO]; 
       [backCard removeFromSuperview]; //or hide it. 
      } 

     } completion:nil]; 
    } 
} 
+1

¡Respuesta perfecta! ¡Eres genial! :RE –

10

Tuve el mismo problema. Después de buscar diferentes publicaciones en Internet, pude encontrar una solución elegante y fácil. Tengo las tarjetas como UIButtons personalizados. En la clase UIButton encargo añadí el método que cambia la imagen de fondo con una animación de imágenes cambiantes:

-(void) flipCard{ 
    [UIView transitionWithView:self 
         duration:0.3f 
         options:UIViewAnimationOptionTransitionFlipFromRight|UIViewAnimationOptionCurveEaseInOut 
        animations:^{ 
         if (self.isFlipped) { 
          [self setBackgroundImage:[UIImage imageNamed:@"card_back_2.png"] forState:UIControlStateNormal]; 
         }else{ 
          [self setBackgroundImage:[UIImage imageNamed:self.cardName] forState:UIControlStateNormal]; 
         } 
        } completion:NULL]; 
    self.isFlipped = !self.isFlipped; 
} 

Espero que esto ayude a alguien más como la primera respuesta ha sido ya aceptada

ACTUALIZACIÓN

Si se encuentra en la vista que contiene esta sub-vista, el código es:

-(void)flipCard:(APCard*)card{ 
    [UIView transitionWithView:card 
         duration:kFlipTime 
         options:UIViewAnimationOptionTransitionFlipFromRight|UIViewAnimationOptionCurveEaseInOut 
        animations:^{ 
         if (card.isFlipped) { 
          [card setBackgroundImage:[UIImage imageNamed:@"card_back_2.png"] forState:UIControlStateNormal]; 
         }else{ 
          [card setBackgroundImage:[UIImage imageNamed:card.cardName] forState:UIControlStateNormal]; 
         } 
        completion:^(BOOL finished) { 
         if (finished) { 
          //DO Stuff 
         } 
        } 
    ]; 
    card.isFlipped = !card.isFlipped; 
} 
Cuestiones relacionadas