user631063
user631063

Reputation:

Make UIImageView animate after another UIImageView has finished

I am trying to animate the dealing of cards. Currently I have two cards, the dealer card (dCard1) and the player card (pCard1).

The player card should be dealt and as soon as it is dealt, the dealer card should then be dealt.

What is currently happening is the player card will animate properly when I press the deal button, but instead of waiting till the player card is done animating, the dealer card just appears at the dealerTo location. It does not animate. I am new to doing animations any help would be greatly appreciated.

-(void) animateHandsDealt: (Hand*) pHand:(Hand*) dHand{
pCard1= [[UIImageView alloc] initWithFrame:CGRectMake(125, 0, 75, 110)];
dCard1= [[UIImageView alloc] initWithFrame:CGRectMake(125, 0, 75, 110)];

CGFloat start = 0;
CGFloat duration = 1;

CGPoint playerTo = CGPointMake(120, 300);
CGPoint dealerTo = CGPointMake(120, 70);

pCard1.image = [UIImage imageNamed:[[pHand.cardArr objectAtIndex:0 ] imagePath]];
[self.view addSubview: pCard1];
[playerImages addObject:pCard1];

CABasicAnimation *move = [CABasicAnimation animationWithKeyPath:@"position" ];
move.fillMode = kCAFillModeBoth;
move.beginTime = start;
[move setToValue:[NSValue valueWithCGPoint:playerTo]];
[move setDuration:duration];
move.removedOnCompletion = FALSE;
[[pCard1 layer] addAnimation:move forKey:@"position"];


dCard1.image = [UIImage imageNamed:@"back-red-75-1.png"];
[self.view addSubview: dCard1];
CABasicAnimation *move2 = [CABasicAnimation animationWithKeyPath:@"position" ];
[move2 setToValue:[NSValue valueWithCGPoint:dealerTo]];
move2.beginTime = start + duration;
[move2 setDuration:duration];
move2.fillMode = kCAFillModeBoth;
move2.removedOnCompletion = FALSE;
[[dCard1 layer] addAnimation:move2 forKey:@"position"];

}

Upvotes: 0

Views: 715

Answers (2)

mbm29414
mbm29414

Reputation: 11598

I don't have access to your classes (of course), but I think this is pretty close to "drop-in-ready" code. What do you think?

- (void)deal {
    // Of course, you'd replace these NSString objects with actual card objects...
    NSArray *array = [NSArray arrayWithObjects:@"pCard1", @"dCard1", @"pCard2", @"dCard2", @"pCard3", @"dCard3", nil];
    [self performSelectorOnMainThread:@selector(animateDealWithArray:) withObject:array waitUntilDone:YES];
}
- (void)animateDealWithArray:(NSArray *)array {
    // constants that won't change call to call
    static CGFloat duration = 1;
    static CGSize  cardSize = {75,  110};
    static CGPoint playerTo = {120, 300};
    static CGPoint dealerTo = {120, 70};

    // Seems like you want the card to start at the top of the "deck" whether it's a player card or not
    UIImageView *card = [[UIImageView alloc] initWithFrame:CGRectMake(125, 0, 75, 110)];
    // Figure out if the first object (the one we're currently using) is a player or dealer card
    if ([[array objectAtIndex:0] isKindOfClass:[PlayerCard Class]]) {
        // Player card, so show the "face"
        [card setImage:[UIImage imageNamed:[(PlayerCard *)[array objectAtIndex:0] imagePath]]];
        [UIView animateWithDuration:duration
                         animations:^{
                             [card setFrame:CGRectMake(playerTo.x, playerTo.y, cardSize.width, cardSize.height)];
                         }
                         completion:^(BOOL finished) {
                             [self dealNext:array];
                         }
         ];
    } else {
        // Dealer card, so show the back
        [card setImage:[UIImage imageNamed:@"back-red-75-1.png"]];
        [UIView animateWithDuration:duration
                         animations:^{
                             [card setFrame:CGRectMake(dealerTo.x, dealerTo.y, cardSize.width, cardSize.height)];
                         }
                         completion:^(BOOL finished) {
                             [self dealNext:array];
                         }
         ];
    }
}
- (void)dealNext:(NSArray *)array {
    int count = [array count];
    if (count > 1) {
        NSArray *newArray = [array subarrayWithRange:NSMakeRange(1, count - 1)];
        [self animateDealWithArray:newArray];
    }
}

Upvotes: 0

jsd
jsd

Reputation: 7703

If you're just animating the frame of the view, you can use the much simpler UIView animateWithDuration... methods.

You chain them by using the animateWithDuration:animations:completion: version. You can specify the second animation in the completion: block of the first animation.

http://developer.apple.com/library/ios/#documentation/uikit/reference/uiview_class/UIView/UIView.html#//apple_ref/doc/uid/TP40006816-CH3-SW109

Upvotes: 1

Related Questions