2012-01-27 14 views
24

Sto sviluppando un gioco che contiene qualche vista (come gioco di carte di memoria) e voglio che quando l'utente tocca una carta questo capovolga e mostri un'altra vista. Uso questo codice:iOS - Capovolgi solo l'animazione per una vista specifica

- (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) { 
    }]; 

} 

Ogni vista ha un pulsante trasparente che coprono l'intera vista, così quando toccare utente su una vista è come toccare il pulsante. Il pulsante chiama il metodo sopra passando il mittente. All'avvio dell'animazione, la vista viene ruotata, non solo la vista che ottengo dal mittente. Come posso fare?

+0

Forse non è una soluzione diretta ma, si può t ry per estendere UIButton per i pulsanti che hai usato sulle carte e riportare un puntatore debole alla vista della carta, quindi chiamare btn.cardView ti darebbe sicuramente la vista della carta che hai desiderato, se la superview non funziona. –

risposta

47

Il seguente codice potrebbe aiutare con il tuo problema. Penso che sia più pulito rispetto all'utilizzo di un pulsante trasparente.

- (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

Risposta perfetta! Sei grande! : D –

10

Ho avuto lo stesso problema. Dopo aver cercato diversi post su Internet, sono riuscito a trovare una soluzione elegante e facile. Ho le carte come UIButtons personalizzati. Nella classe UIButton personalizzato ho aggiunto il metodo che cambia l'immagine di sfondo con un'animazione flip:

-(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; 
} 

Spero che questo aiuti qualcun altro come la prima risposta è stata già accettato

UPDATE

Se si è nella visualizzazione contenente questa sottoview, il codice è:

-(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; 
} 
Problemi correlati