0

カードの扱いをアニメートしようとしています。現在、ディーラーカード(dCard1)とプレーヤーカード(pCard1)の2枚のカードを持っています。

プレイヤーカードが配られ、配られたらすぐにディーラーカードが配られます。

現在起こっていることは、取引ボタンを押すとプレーヤーカードが適切にアニメーション化されることですが、プレーヤーカードのアニメーション化が完了するまで待つのではなく、ディーラーカードがdealerToの場所に表示されるだけです。アニメートしません。私はアニメーションをするのは初めてですが、どんな助けでも大歓迎です。

-(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"];

}

4

2 に答える 2

1

ビューのフレームをアニメーション化するだけの場合は、はるかに単純なUIViewanimateWithDuration...メソッドを使用できます。

それらをチェーンするには、animateWithDuration:animations:completion:versionを使用します。最初のアニメーションのcompletion:ブロックで2番目のアニメーションを指定できます。

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

于 2012-05-02T18:27:53.103 に答える
0

もちろん、私はあなたのクラスにアクセスすることはできませんが、これは「すぐに使える」コードにかなり近いと思います。どう思いますか?

- (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];
    }
}
于 2012-05-02T19:23:26.680 に答える