2012-01-27 11 views
24

Zajmuję się tworzeniem gry, która zawierała pewien widok (jako grę w karty pamięci) i chcę, aby kiedy użytkownik dotknął karty, odwrócił i pokazał inny widok. Używam tego kodu:iOS - Odbij animację tylko dla określonego widoku

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

} 

Każdy widok ma przezroczysty przycisk, który pokrywa cały widok, więc gdy użytkownik stuknie w widok, dotknij przycisku. Przycisk wywołuje metodę powyżej przekazując nadawcę. Po uruchomieniu animacji cały widok jest odwracany, nie tylko widok otrzymuję od nadawcy. Jak mogę zrobić?

+0

Może nie jest to bezpośrednie rozwiązanie, ale możesz ry, aby wydłużyć Uibutton dla przycisków używanych na kartach i mieć słaby wskaźnik z powrotem do widoku karty, dlatego wywołanie btn.cardView z pewnością dostarczy Ci widok karty, której potrzebujesz, jeśli superview nie działa. –

Odpowiedz

47

Poniższy kod może pomóc w rozwiązaniu problemu. Myślę, że jest czystszy niż użycie przezroczystego przycisku.

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

Doskonała odpowiedź! Jesteś świetny! :RE –

10

Miałem ten sam problem. Po przeszukaniu różnych postów w Internecie udało mi się wymyślić eleganckie i łatwe rozwiązanie. Mam karty jako niestandardowe UButtons. W klasie niestandardowe UIButton dodałem metodę, która zmienia obraz tła z animacją odwrotną:

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

nadzieję, że to pomaga kogoś innego jako pierwsza odpowiedź została już przyjęta

UPDATE

Jeśli jesteś w widoku zawierającym ten podprzegląd, kod to:

-(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; 
} 
Powiązane problemy