我正在创建一个英文打字游戏。单词从键盘的顶部落到边缘。为了动画我使用的标签的下降:
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()的函数中。并且使用NSTimer每5秒调用一次createLabel函数。游戏结束后,我用重启按钮显示上面的视图。现在问题来了:
在游戏结束之前,我们可能已经创建了3-4个已推入动画块的标签。但第一个标签可能会结束游戏。我用一个重启按钮获得了它上方的游戏结构视图。一旦我点击重启,我的游戏再次结束,因为之前创建的标签仍在调用UIAnimation的完成块。除非我的所有标签都完成了动画,否则我无法重启游戏。
如果游戏完成后有没有办法删除动画,以便已经创建的标签不再进入完成块?
我使用以下代码从视图中删除标签并删除其动画:
for label in self.currentLabelsArray {
label.layer.removeAllAnimations()
label.removeFromSuperview()
}
答案 0 :(得分:1)
一个快速的猜测是,也许你错过了使计时器对象无效。
for label in self.currentLabelsArray {
label.layer.removeAllAnimations()
label.removeFromSuperview()
}
myTimer.invalidate();
所以定时器在5秒后不会调用createLabels
。一旦游戏重新开始计划时间再次。
希望有所帮助!
修改强>
另一个指针可能是清除标签数组。
self.currentLabelsArray.removeAllObjects();
并调用self.gameOver()
iff,队列中没有游戏请求。
修改强>
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()
}
}