在UILabel

时间:2016-05-26 07:49:18

标签: ios objective-c iphone xcode swift

我正在创建一个英文打字游戏。单词从键盘的顶部落到边缘。为了动画我使用的标签的下降:

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()
                }

1 个答案:

答案 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()
}

}