我正在创建一个英语打字游戏。单词从键盘的顶部到边缘。为了对我使用的标签的下落进行动画处理:
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()
}
一切顺利。我面临的问题是:我在创建每个标签时调用这个动画 block 。实际上这个动画 block 位于一个名为 createLabels() 的函数中。使用 NSTimer 每 5 秒调用一次 createLabel 函数。游戏结束后,我会显示上面的 View ,并带有重新启动按钮。现在问题来了:
在游戏结束之前,我们可能已经创建了 3-4 个标签,并将其推送到动画 block 中。但第一个标签可能会结束游戏。我在其上方看到一个游戏结束 View ,并带有重新启动按钮。一旦我点击重新启动,我的游戏就会再次结束,因为之前创建的标签仍在调用 UIAnimation 的完成 block 。除非我的所有标签都完成了动画,否则我无法重新启动游戏。
有没有办法在游戏完成后移除动画,这样已经创建的标签就不会再进入完成 block ?
我使用以下代码从 View 中删除标签并删除其动画:
for label in self.currentLabelsArray {
label.layer.removeAllAnimations()
label.removeFromSuperview()
}
最佳答案
一个快速的猜测是,也许您错过了使计时器对象无效的操作。
for label in self.currentLabelsArray {
label.layer.removeAllAnimations()
label.removeFromSuperview()
}
myTimer.invalidate();
因此计时器不会在 5 秒后调用 createLabels
。游戏重新开始后重新安排时间。
希望对您有所帮助!
编辑:
另一个指针可能是清除标签数组。
self.currentLabelsArray.removeAllObjects();
调用self.gameOver()
当且仅当,队列中没有游戏结束请求。
编辑:
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()
}
}
关于ios - 在 UILabel 上添加和删除动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37454681/