2016-05-26 7 views
0

Ich erstelle ein Spiel für Englisch tippen. Die Wörter fallen von oben bis zum Rand der Tastatur. Zum Animieren des Falls eines Labels habe ich folgendes verwendet:Hinzufügen und Entfernen von Animationen auf einem 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() 


} 

Alles geht gut. Das Problem, dem ich gegenüberstehe, ist: Ich nenne diesen Animationsblock bei der Erstellung jedes einzelnen Etiketts. Tatsächlich befindet sich dieser Animationsblock in einer Funktion namens createLabels(). Und die createLabel-Funktion wird alle 5 Sekunden mit NSTimer aufgerufen. Sobald das Spiel vorbei ist, zeige ich eine Ansicht oben mit dem Neustart-Button. Jetzt kommt das Problem:

Bevor das Spiel endet, könnten wir 3-4 Labels haben bereits erstellt, die in den Animationsblock geschoben werden. Aber das allererste Label könnte das Spiel beenden. Ich bekomme eine Gameover-Ansicht darüber mit einem Neustart-Button. Sobald ich auf Neustart klicke, endet mein Spiel erneut, weil die zuvor erstellten Labels immer noch den Completion-Block von UIAnimation aufrufen. Ich kann das Spiel nicht neu starten, wenn nicht alle meine Labels die Animation abgeschlossen haben.

Gibt es eine Möglichkeit Animation, sobald das Spiel zu entfernen, wenn abgeschlossen, so dass die bereits erstellten Etiketten nicht mehr kommen in den Abschluss-Block?

Ich habe den folgenden Code verwendet, um das Etikett aus dem Blickfeld zu entfernen, und entfernen Sie die Animation:

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

Antwort

1

Eine schnelle Vermutung ist, dass Sie vielleicht das Timer-Objekt zu entkräften verpaßt.

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

So wird der Timer createLabels nach 5 sec nicht nennen. Sobald das Spiel neu startet, planen Sie die Zeit erneut ein.

Hoffe, dass hilft!

EDIT:

Ein weiterer Zeiger könnte sein, die Etiketten-Array zu löschen.

self.currentLabelsArray.removeAllObjects(); 

und self.gameOver() iff nennen, gibt es keine Anfrage von Spiel über in der Warteschlange.

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

Nein ich den Timer in der Funktion ungültig gameover. Aber es ist nicht das Problem der Timer-Entwertung. Die Etiketten, die vor dem Ungültigmachen erstellt wurden, verursachen das Problem. Das Spiel endet nach dem ersten Label. Aber es gibt 2-3 weitere Labels, die bereits auf der Ansicht sind. –

+0

@AmritSidhu, aktualisierte meine Antworten. – NeverHopeless

+0

Sorry, das hat nicht geholfen! –

Verwandte Themen