2012-01-27 22 views
24

Tôi đang phát triển trò chơi có chứa một số chế độ xem (như trò chơi thẻ nhớ) và tôi muốn điều đó khi người dùng chạm vào thẻ lật này và hiển thị một chế độ xem khác. Tôi sử dụng mã này:iOS - Chỉ hoạt hình lật cho chế độ xem cụ thể

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

} 

Mỗi chế độ xem có nút trong suốt bao phủ toàn bộ chế độ xem, khi người dùng chạm vào chế độ xem là nhấn nút. Nút gọi phương thức trên truyền người gửi. Khi hoạt ảnh bắt đầu tất cả chế độ xem được lật, không chỉ chế độ xem tôi nhận được từ người gửi. Tôi có thể làm như thế nào?

+0

Có thể không phải là giải pháp trực tiếp nhưng bạn có thể ry để mở rộng UIButton cho các nút bạn sử dụng trên thẻ và có một con trỏ yếu trở lại xem thẻ, do đó gọi btn.cardView chắc chắn sẽ giúp bạn có được cái nhìn của thẻ mà bạn đã muốn, nếu superview không hoạt động. –

Trả lời

47

Mã sau đây có thể giúp khắc phục sự cố của bạn. Tôi nghĩ rằng nó sạch hơn là sử dụng một nút trong suốt.

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

Câu trả lời hoàn hảo! Bạn tuyệt vời! : D –

10

Tôi đã gặp vấn đề tương tự. Sau khi tìm kiếm các bài viết khác nhau trên internet tôi đã có thể đưa ra một giải pháp thanh lịch và dễ dàng. Tôi có các thẻ như UIButtons tùy chỉnh. Trong lớp tùy chỉnh UIButton tôi đã thêm các phương pháp làm thay đổi hình nền với một hình ảnh động lật:

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

Hy vọng điều này sẽ giúp người khác là câu trả lời đầu tiên đã được đã được chấp nhận

CẬP NHẬT

Nếu bạn đang ở chế độ xem có chứa chế độ xem phụ này, mã là:

-(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; 
} 
Các vấn đề liên quan