0

我要做“猜对牌”游戏,即:窗口中有24张卡片(UIImageView),隐藏在视图显示表面,它们是12组数字,你触摸一个,然后它会在里面打开显示,找到如果打开了同一张卡,如果不匹配,则两张打开的卡将隐藏。

只是这个。

打开卡片和隐藏卡片动作使用 UIView 动画。但是现在我有一个问题。当我触摸卡片时,它会尝试查找是否有匹配项。但是开卡和关卡动作动画是同时执行的。连我看清楚的卡片内容都看不清楚。

我想在触摸后打开一张卡片,然后(甚至等待 0.5 秒)同时关闭打开的不匹配的卡片。不能同时开卡和关卡。但是在下面的代码中,我确实先打开了一张卡,然后计算,然后关闭了两张打开的卡。

@interface Card : UIImageView

@property BOOL expanded;
@property BOOL found;
@property (retain)NSString * nameTitle;
@property (retain) UIImage * expandedImage;

@end


//
//  Card.m
//  Guest card match
//
//  Created by  on 11-10-20.
//  Copyright 2011年 __MyCompanyName__. All rights reserved.
//

#import "Card.h"
#import "MainAppDelegate.h"

@implementation Card
@synthesize expanded;
@synthesize found;
@synthesize expandedImage;
@synthesize nameTitle;

- (id)init
{
    if ((self = [super init])) {
        [self setUserInteractionEnabled:YES];
        self.image = [UIImage imageNamed:@"cardface_48.png"];
        self.expanded = NO;
        self.found = NO;
    }
    return self;
}

- (void)openCard{
    NSLog(@"open card");
    if (self.expanded){return;}
    self.expanded = YES;
    [UIView beginAnimations:@"animation1" context:nil]; 
    [UIView setAnimationDuration:0.8];
    [UIView setAnimationDelegate:self];

    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self cache:YES];
    [self setTransform:CGAffineTransformMakeScale(3.0, 3.0)];
    [self setImage:self.expandedImage];
    [UIView commitAnimations];

    [UIView beginAnimations:@"animation1_open" context:nil]; 
    [UIView setAnimationDuration:1.2];
    [UIView setAnimationDelegate:self];

    [UIView setAnimationBeginsFromCurrentState:NO];
    [self setTransform:CGAffineTransformMakeScale(1, 1)];
    [UIView commitAnimations];


}

- (void)closeCard{
    if (!self.expanded){return;}
    self.expanded = NO;

    [UIView beginAnimations:@"animation1_close" context:nil]; 
    [UIView setAnimationDuration:0.8];
    [UIView setAnimationDelegate:self];


    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self cache:YES];
    [self setTransform:CGAffineTransformMakeScale(3.0, 3.0)];
    [self setImage:[UIImage imageNamed:@"cardface_48.png"]];
    [UIView commitAnimations];

    [UIView beginAnimations:@"animation2_close" context:nil]; 
    [UIView setAnimationDuration:1.2];
    [UIView setAnimationDelegate:self];


    [UIView setAnimationBeginsFromCurrentState:NO];
    [self setTransform:CGAffineTransformMakeScale(1, 1)];
    [UIView commitAnimations];
    [self setUserInteractionEnabled:YES];


}


- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    // Do what you want here 
    //NSLog(@"touchesBegan!"); 
    //[self setUserInteractionEnabled:NO];
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 

    NSLog(@"card tag: %d", self.tag);
    if (self.expanded) {
        return;
    }

    [self openCard];
    for (NSInteger tagNumber=10001; tagNumber<10025; tagNumber++) {
        Card *card = (Card *)[self.superview viewWithTag:tagNumber];
        if (card.expanded && card.tag != self.tag && !card.found) {
            if ([card.nameTitle isEqualToString:self.nameTitle]) {// Found match!
                NSLog(@"Match!");
                [card setUserInteractionEnabled:NO];
                [self setUserInteractionEnabled:NO];
                card.found = YES;
                self.found = YES;
            }else{
                NSLog(@"not Match!");
                [card closeCard];
                [self closeCard];

            }
        }else{
           [self setUserInteractionEnabled:YES]; 
        }
    }


} 

@end

更新:我关注了 Kashiv,这个更新的代码:

- (void)openCard{
    NSLog(@"open card");
    if(cardAnimationIsActive) return;
    cardAnimationIsActive = YES;


    if (self.expanded){return;}
    self.expanded = YES;


    [UIView animateWithDuration:2.0f animations:^{


        [UIView beginAnimations:@"animation1" context:nil]; 
        [UIView setAnimationDuration:0.8];
        [UIView setAnimationDelegate:self];

        [UIView setAnimationBeginsFromCurrentState:YES];
        [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self cache:YES];
        [self setTransform:CGAffineTransformMakeScale(3.0, 3.0)];
        [self setImage:self.expandedImage];
        [UIView commitAnimations];

        [UIView beginAnimations:@"animation1_open" context:nil]; 
        [UIView setAnimationDuration:1.2];
        [UIView setAnimationDelegate:self];

        [UIView setAnimationBeginsFromCurrentState:NO];
        [self setTransform:CGAffineTransformMakeScale(1, 1)];
        [UIView commitAnimations];



    } completion:^(BOOL finished){
        cardAnimationIsActive = NO;
    }];




}

- (void)closeCard{

    if(cardAnimationIsActive) return;
    cardAnimationIsActive = YES;

    if (!self.expanded){return;}
    self.expanded = NO;

    [UIView animateWithDuration:5.0f animations:^{
        [UIView beginAnimations:@"animation1_close" context:nil]; 
        [UIView setAnimationDuration:0.8];
        [UIView setAnimationDelegate:self];


        [UIView setAnimationBeginsFromCurrentState:YES];
        [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self cache:YES];
        [self setTransform:CGAffineTransformMakeScale(3.0, 3.0)];
        [self setImage:[UIImage imageNamed:@"android_48.png"]];
        [UIView commitAnimations];

        [UIView beginAnimations:@"animation2_close" context:nil]; 
        [UIView setAnimationDuration:1.2];
        [UIView setAnimationDelegate:self];


        [UIView setAnimationBeginsFromCurrentState:NO];
        [self setTransform:CGAffineTransformMakeScale(1, 1)];
        [UIView commitAnimations];
        [self setUserInteractionEnabled:YES];
    } completion:^(BOOL finished){
        cardAnimationIsActive = NO;
    }];




}

但是 opencard 和 closecard 动画仍然同时执行。

4

3 回答 3

0

你可以使用:

[UIView setAnimationDelay:delay];

将所有动画延迟到适当的时间,以便它们按顺序运行。

于 2011-12-26T16:08:24.520 回答
0

[UIView animateWithDuration:0.2 动画:^{view.alpha = 0.0;} 完成:^(BOOL 完成){ [view removeFromSuperview]; }];

您可以在完成块中创建第二个动画。

于 2011-12-26T16:10:57.627 回答
0

您可以通过使用基于块的动画来实现这一点:

+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion

BOOL然后您可以使用iVar(例如)检查动画是否仍在执行或已完成cardAnimationIsActive

例子:

- (void)openCard {
    if(cardAnimationIsActive) return;
    cardAnimationIsActive = YES;
    [UIView animateWithDuration:duration animations:^{
        --- your open animations ---
    } completion:^(BOOL finished){
        cardAnimationIsActive = NO;
    }];
}

- (void)closeCard {
    if(cardAnimationIsActive) return;
    cardAnimationIsActive = YES;
    [UIView animateWithDuration:duration animations:^{
        --- your close animations ---
    } completion:^(BOOL finished){
        cardAnimationIsActive = NO;
    }];
}
于 2011-12-26T16:12:21.737 回答