2016-05-26 16 views
0

英語入力用のゲームを作成しています。単語はキーボードの上端から下端まで落ちます。ラベルの崩れをアニメーション化するために私は使用しました:UILabelでのアニメーションの追加と削除

UIView.animateWithDuration(25, delay: 0, options: UIViewAnimationOptions.CurveLinear, animations: { 

label.frame = CGRectMake(self.view.frame.width - (label.frame.origin.x+label.frame.width), self.view.frame.height-self.keyboardYPosition!, label.frame.width, width) 

}){(success) in 

label.removeFromSuperview() 

for label in self.currentLabelsArray { 
        label.layer.removeAllAnimations() 
        label.removeFromSuperview() 
       } 
self.gameOver() 


} 

すべてがうまく行きます。私が直面している問題は次のとおりです。私はすべての単一ラベルの作成時にこのアニメーションブロックを呼び出しています。実際、このアニメーションブロックはcreateLabels()という関数内にあります。また、createLabel関数は、NSTimerを使用して5秒ごとに呼び出されます。ゲームが終わったら、再開ボタンを使って上のビューを表示します。

ゲームが終了する前に、アニメーションブロックにプッシュされた3-4のラベルが既に作成されている可能性があります。しかし、最初のラベルはゲームを終了するかもしれない。再起動ボタンでゲームオーバービューを表示します。一度タップして再起動すると、以前作成したラベルがまだUIAnimationの完了ブロックを呼び出すため、ゲームが再び終了します。すべてのレーベルがアニメーションを完了していない限り、ゲームを再開することはできません。

ゲームが完了したらアニメーションを削除して、既に作成済みのラベルが完成ブロックに入らないようにする方法はありますか?

私は、ビューからラベルを削除し、そのアニメーションを削除するには、次のコードを使用しています

for label in self.currentLabelsArray { 
        label.layer.removeAllAnimations() 
        label.removeFromSuperview() 
       } 

答えて

1

迅速な推測では、おそらくあなたは、タイマーオブジェクトを無効にするために逃した、ということです。

for label in self.currentLabelsArray { 
    label.layer.removeAllAnimations() 
    label.removeFromSuperview() 
} 
myTimer.invalidate(); 

したがって、タイマーは5秒後にcreateLabelsを呼び出しません。ゲームが再開したら、もう一度時間をスケジュールします。

希望に役立ちます!

EDIT:

別のポインタがラベルの配列をクリアすることができます。

self.currentLabelsArray.removeAllObjects(); 

とすると、ゲームオーバーの要求はありません。

EDIT:

UIView.animateWithDuration(25, delay: 0, options: UIViewAnimationOptions.CurveLinear, animations: { 

label.frame = CGRectMake(self.view.frame.width - (label.frame.origin.x+label.frame.width), self.view.frame.height-self.keyboardYPosition!, label.frame.width, width) 

}){(success) in 

//label.removeFromSuperview() 

for label in self.currentLabelsArray { 
    label.layer.removeAllAnimations() 
    label.removeFromSuperview() 
} 

if(self.currentLabelsArray.count > 0) { 
    self.currentLabelsArray.removeAllObjects() 
    self.gameOver() 
} 

} 
+0

私はゲームオーバー機能にタイマーを無効にすることはできません。しかし、それはタイマーの無効化の問題ではありません。無効化の前に作成されたラベルが問題を作り出しています。ゲームは最初のラベルの後に終了します。しかし、そこには既に2〜3個のラベルがあります。 –

+0

@AmritSidhu、私の答えを更新しました。 – NeverHopeless

+0

申し訳ありません、それは助けになりませんでした! –

関連する問題