私は4枚のカードがスクリーンに配られた小さなカードゲームを書いています。ユーザーは各カードをタップして(もう一度隠すことができます)。UIView setAnimationTransitionはときどき動作しますが、必ずしもそうではありませんか?
各カードフロントとカードバックは画像ビューに保存されています。 UIButtonはユーザタップを捕まえ、カードを裏返す必要があります。
カードの表裏をサブビューとしてコンテナビューに追加しました。アニメーションにはUIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight
というメソッドを使用します。
以下のコードを参照してください。簡略化のため、以下の方法で4つの異なるカードの処理を削除しました&可読性。また、私はいくつかの配列/ファイル名のジャグリングを静的なイメージ名で置き換えました。
このコードでは奇妙なことが、現在は10回連続して動作することがあります(反転するアニメーションが表示されます)が、アニメーションが全く表示されないことがあります。フリッピング)。それから、それはまったく逆です。カードがアニメーションなしで7〜8回表示され、突然フリップアニメーションが表示されることがあります。 私はこの奇妙な行動の理由を見ることができないので、ナットを運転しています。 ご存知ですか?私の推測では、[self performSelector:@selector(flipSingleCard) withObject:nil afterDelay:0.0];
が犯人であるということである
-(void)flipCardButtonClicked:(id)sender
{
containerView = [[UIView alloc] initWithFrame: CGRectMake(25,420,220,300)];
[self.view addSubview:containerView];
c1Flipped = !c1Flipped;
cardback1 = [[UIImageView alloc] initWithFrame: CGRectMake(0,0,220,300)];
cardfront1 = [[UIImageView alloc] initWithFrame: CGRectMake(0,0,220,300)];
if (c1Flipped)
{
cardback1.image = [UIImage imageNamed:@"backside.png"];
cardfront1.image = [UIImage imageNamed:@"frontside.png"];
}
else
{
cardback1.image = [UIImage imageNamed:@"frontside.png"];
cardfront1.image = [UIImage imageNamed:@"backside.png"];
}
[containerView addSubview:cardfront1];
[containerView addSubview:cardback1];
[cardfront1 release];
[cardback1 release];
[self performSelector:@selector(flipSingleCard) withObject:nil afterDelay:0.0];
}
-(void)flipSingleCard
{
[containerView.layer removeAllAnimations];
[UIView beginAnimations:@"cardFlipping" context:self];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(flipDidStop:finished:context:)];
[UIView setAnimationDuration:0.5];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:containerView cache:YES];
[containerView exchangeSubviewAtIndex:0 withSubviewAtIndex:1];
[UIView commitAnimations];
}
-(void)flipDidStop:(NSString*)animationID finished:(BOOL)finished context:(void *)context
{
[containerView removeFromSuperview];
[containerView release];
}
アニメーションが非同期であるため、メソッドを直接呼び出す代わりにセレクタを使用する主な理由だと考えました。実際のアニメーションが停止する前にsetAnimationDidStopSelectorメソッドが呼び出されるべきではありません。 – SpaceAce
非同期がどのようにセレクタ対ダイレクトメソッド呼び出しを使用することに影響するかはわかりません。基本的にどちらの方法でも同じことをしています...実際の遅延を追加しようとしましたか? – BHendricks
申し訳ありませんが、私は間違ったセレクターを見ていました。私はperformSelectorで変更を試して、結果を投稿します。もう一度感謝します。 サイドノート:自分のコメントを編集/削除するオプションはありますか? – SpaceAce